sql >> データベース >  >> NoSQL >> MongoDB

SQLを使用したMongoDB結合のリンクと作成:パート1

    SQLは、クエリに関する限り、リレーショナルデータベースを利用するための最も好ましい方法です。ユーザーは、SQLクエリ機能を採用しているMySQLやPostgreSQLなどのリレーショナルデータベースを使用していたと理解されています。一般に、SQLは理解しやすいため、特にリレーショナルデータベースで広く使用されるようになりました。

    ただし、データベース内のさまざまなドキュメントを使用しようとすると、SQLは非常に複雑になります。一言で言えば、それは多くの挫折を伴うので、ドキュメントデータベースを対象としていません。たとえば、埋め込まれた配列ドキュメントを簡単にクエリすることはできません。または、返されたデータを反復およびフィルタリングして必要な結果を得るサブプログラムを設計する必要があります。したがって、これにより実行時間が増加します。ただし、SQLをよく理解していると、最初から始めるのではなく、ある時点からMongoDBを操作するためのより良い基盤が得られます。

    このブログでは、Studio 3Tプログラムを使用して、さまざまなSQL結合クエリと、それらをMongoDBクエリに再設計してパフォーマンスを向上させる方法を示します。プログラムはこのリンクからダウンロードできます。

    SQLをMongoDBに接続する

    SQLを使用してMongoDBと通信できるいくつかのドライバーまたはインターフェースがあります(例:ODBC)。 ODBCは、OpenDatabaseConnectivityの略です。これは、アプリケーションがデータベース管理システムのデータにアクセスするための標準プロセスとしてSQLを使用して、そのデータにアクセスできるようにするための単なるインターフェイスです。相互運用性の利点が追加され、単一のアプリケーションが複数のデータベース管理システムにアクセスできるようになります。

    このブログでは、SQLからコードを生成してテストし、集計エディターを介してコードを最適化して、MongoDBクエリを生成します。

    SQLのチャートをMongoDBにマッピング

    詳細に入る前に、これら2つのデータベース間の基本的な関係、特にクエリの概念におけるキーワードを理解する必要があります。

    用語と概念

    SQL MongoDB
    テーブル


    テーブル結合
    コレクション
    BSONドキュメント
    フィールド
    $lookup

    SQLの主キーは、基本的にレコード時間の順に行を配置する一意の列を定義します。一方、MongoDBの主キーは、ドキュメントを保持し、インデックス付きフィールドに重複する値が格納されないようにするための一意のフィールドです。

    SomeninesがMongoDBDBAになる-MongoDBを本番環境に導入MongoDBDownloadを無料でデプロイ、監視、管理、スケーリングするために知っておくべきことを学びましょう

    SQLとMongoDBの相関関係

    学生データがあり、このデータをSQLデータベースとMongoDBの両方に記録したいとします。単純な学生オブジェクトを次のように定義できます:

    {
        name: ‘James Washington’,
        age: 15,
        grade: A,
        Score: 10.5
    }

    SQLテーブルを作成する際には、列名とデータ型を定義する必要がありますが、MongoDBでは、最初の挿入時にコレクションが自動的に作成されます。

    次の表は、SQLステートメントの一部をMongoDBで作成する方法を理解するのに役立ちます。

    SQLスキーマステートメント MongoDBスキーマステートメント
    CREATE TABLE students (
      id MEDIUMINT NOT NULL AUTO_INCREMENT,
      name Varchar (30),
      age Number,
      score Float
    )

    データベースにドキュメントを挿入するには

    INSERT INTO students(Name, age, grade,score) VALUES(“James Washington”, 15, “A”, 10.5)

    マングースなどのいくつかのモジュールを使用してスキーマ設計を定義し、相関関係を示すためにドキュメントを直接挿入するのではなく、オブジェクトのようにフィールドを定義できます。プライマリファイルIDは、ドキュメントの挿入中に自動的に生成されます。

    {
      name: String,
      age Number,
      score: Number
    }

    コレクションを作成するための新しいドキュメントの挿入

    db.students.insertOne({
        name: ‘James Washington’,
        age: 15,
        grade: ‘A’,
        score: 10.5
    })

    ADDステートメントを使用して、既存のテーブルに新しい列を追加します。

    ALTER TABLE students ADD units 10

    コレクションドキュメントの構造は明確に定義されていないため、updateMany()

    を使用してドキュメントレベルでドキュメントを更新します。
    db.students.updateMany({}, {$set: {units: 10}})

    列をドロップするには(単位)

    ALTER TABLE students DROP COLUMN units

    フィールド(ユニット)をドロップするには

    db.students.updateMany({}, {$unset: {units: “”}})

    テーブルの生徒をドロップするには

    DROP TABLE students

    コレクションの生徒をドロップするには

    db.students.drop()
    SQLSelectステートメント MongoDBfindステートメント

    すべての行を選択

    SELECT * FROM students

    すべてのドキュメントを選択

    db.students.find()

    特定の列のみを返すため。

    SELECT name, grade FROM students

    特定のフィールドのみを返します。デフォルトでは、投影プロセスで特に指定されていない限り、_idフィールドが返されます。

    db.students.find({}, {name: 1, grade: 1, _id: 0})

    _id:0を設定すると、返されるドキュメントのみが名前とグレードオブジェクトの値のみを持つことを意味します。

    列の値が一致する特定の行を選択します。

    SELECT * FROM students WHERE grade = “A”

    フィールド値が一致する特定のドキュメントを選択します。

    db.students.find({grade: “A”})

    提供された基準値として値にいくつかの文字が含まれる列を持つ行を選択する

    SELECT * FROM students WHERE name like  “James%”

    提供された基準値として値にいくつかの文字が含まれるフィールドを持つドキュメントを選択する

    db.students.find({grade: {$regex: /^James/}})

    主キーを使用して行を昇順で返すには。

    SELECT * FROM students ORDER BY id ASC

    主キーを使用して昇順でドキュメントを返すには

    db.students.find().sort({$natural: 1})

    返された行をいくつかの列(グレード)に従ってグループ化するには

    SELECT DISTINCT (grade) FROM students

    返されたドキュメントを特定のフィールド(グレード)に従ってグループ化するには

    db.students.aggregate([
    {$group: : {_id: “$grade”}}
    ]

    返される行の数を制限し、一部をスキップする

    SELECT * FROM students LIMIT 1 SKIP 4

    返されるドキュメントの数を制限し、行をスキップする

    db.students.find.limit(1).skip(4)

    重要なオプションは、クエリがどのように実行されるかを知ることです。したがって、explainメソッドを使用します。

    EXPLAIN SELECT *  FROM students WHERE grade “A”
    db.students.find({grade: “A”}).explain()
    SQLUpdateステートメント MongoDB更新ステートメント

    15歳以上の生徒の成績列を更新します

    UPDATE students SET grade  = “B” WHERE age >= 15

    ここでは、$ gt、$ lt、$lteなどの演算子を使用しています。

    db.students.updateMany({age: {$gte: 15}}, {$set: {status: “B”}})

    列の値をインクリメントする

    UPDATE students SET age  = age + 1 WHERE age < 15
    db.students.updateMany({
    age: {$lt:15}},{$inc: {age: 1}})
    SQL削除ステートメント MongoDBの削除ステートメント

    すべての行を削除するには

    DELETE FROM students

    すべてのドキュメントを削除します。

    db.students.remove({})

    一部の列に特定の値がある特定の行を削除します。

    DELETE FROM students WHERE age = 15
    db.students.remove({age: 15})

    このサンプルマッピングテーブルを使用すると、次のトピックで学習する内容をよりよく理解できます。

    SQLおよびStudio3T

    Studio 3Tは、SQLとMongoDBの接続に役立つ利用可能なプログラムの1つです。 SQLを操作するために拡張するためのSQLクエリ機能があります。クエリはMongoシェルに解釈され、同等のMongoDB言語で単純なクエリコードが生成されます。単純なクエリを実行するだけでなく、Studio3Tアプリケーションは結合を実行できるようになりました。

    上記のサンプルデータの場合、Studio 3Tでデータベースを接続した後、SQLウィンドウを使用して、条件に一致するドキュメントを見つけることができます。例:

    SELECT * FROM students  WHERE name LIKE  'James%';

    名前フィールドが値Jamesに設定されているドキュメントがある場合は、そのドキュメントが返されます。同様に、[クエリコード]タブをクリックすると、同等のMongoDBコードを含むウィンドウが表示されます。上記のステートメントでは、次のようになります。

    db.getCollection("students").find(
        { 
            "name" : /^James.*$/i
        }
    );

    概要

    SQLに関する知識から、MongoDBをすばやく操作する方法が必要になる場合があります。 SQLとMongoDBの同等のコードとの基本的なコードの類似点をいくつか学びました。さらに、Studio 3Tなどの一部のプログラムには、SQLクエリをMongoDBと同等の言語に変換し、より良い結果を得るためにこのクエリを微調整するための十分に確立されたツールがあります。さて、私たちのほとんどにとって、これは私たちの仕事を簡単にし、最終的に私たちが持っているコードがデータベースのパフォーマンスに非常に最適であることを保証するための素晴らしいツールになります。このブログのパート2では、MongoDBのSQLINNERJOINについて学習します。


    1. Python-Redisサーバーが利用可能かどうかを確認する方法

    2. Passportによる複数のユーザータイプのサポート-localmongoosenode.js

    3. SpringデータMongoDb:MappingMongoConverter remove _class

    4. メッセージを待っているHiredis