ホームページ >テクノロジー周辺機器 >IT業界 >MongoDB NoSQLデータベースに参加する

MongoDB NoSQLデータベースに参加する

William Shakespeare
William Shakespeareオリジナル
2025-02-18 12:59:14472ブラウズ

Using JOINs in MongoDB NoSQL Databases

コアポイント

    NOSQLデータベースであるMongoDBは、バージョン3.2に新しい
  • オペレーターを導入しました。ただし、この演算子は、単純なルックアップクエリよりも複雑で遅い総操作での使用に限定されています。 $lookup
  • mongodbの
  • オペレーターには、4つのパラメーターが必要です。$lookup(ドキュメントの検索フィールドを入力)、localField(接続するコレクション)、from >)andforeignField(出力フィールドの名前)。このオペレーターは、集約クエリで使用して、投稿を一致させ、順番に並べ替え、アイテムの数を制限し、ユーザーデータを接続し、ユーザー配列をフラット化し、必要なフィールドのみを返すことができます。 from asMongoDBの
  • オペレーターは有用であり、NOSQLデータベースで少量のリレーショナルデータを管理するのに役立ちますが、SQLのより強力な結合条項に代わるものではありません。ユーザードキュメントがMongoDBで削除されている場合、Orphan Postドキュメントが保持され、制約がないことを示します。したがって、
  • 演算子が頻繁に使用される場合、間違ったデータストレージが使用され、リレーショナル(SQL)データベースがより適していることを示している可能性があります。 $lookup $lookup

彼のピアレビューヘルプをありがとう、ジュリアン・モッツに感謝します。 Using JOINs in MongoDB NoSQL Databases

SQLデータベースとNOSQLデータベースの最大の違いの1つが結合されます。リレーショナルデータベースでは、SQL結合句を使用すると、それらの間の共通フィールドを使用して2つ以上のテーブルから行を組み合わせることができます。たとえば、本と出版社のテーブルがある場合は、次のSQLコマンドを書くことができます。

言い換えれば、本のテーブルには、パブリッシャーテーブルのIDフィールドを参照するPublisher_IDフィールドがあります。

1人の出版社が数千冊の本を提供できるため、これは実用的です。将来出版社の詳細を更新する必要がある場合は、個々のレコードを変更できます。各本の出版社の情報を繰り返す必要がないため、データの冗長性が最小限に抑えられます。この技術は標準化と呼ばれます。
<code class="language-sql">SELECT book.title, publisher.name
FROM book
LEFT JOIN book.publisher_id ON publisher.id;</code>

SQLデータベースは、関係の維持を確保するために、さまざまな標準化と制約を提供します。

nosql ==結合なし?

これは必ずしもそうではありません…

ドキュメント指向のデータベース(MongoDBなど)は、非正規化データを保存するように設計されています。理想的には、セット間に関係がないはずです。同じデータが2つ以上のドキュメントにある必要がある場合は、繰り返す必要があります。 これは、

がリレーショナルデータを必要としない状況がほとんどないため、イライラする可能性があります。幸いなことに、MongoDB 3.2は、2つ以上のセットで左翼に結合した操作を実行できる新しい

オペレーターを導入しました。しかし、問題があります...

mongodb集合

$lookup総操作でのみ使用することができます。それを、結果をクエリ、フィルター、およびグループの結果を照会した一連のオペレーターのパイプラインと考えてください。 1つの演算子の出力は、次の演算子への入力として使用されます。

集約は、単純なルックアップクエリよりも理解するのが難しく、通常は遅くなります。ただし、それらは強力であり、複雑な検索操作にとって貴重なオプションです。

例を使用して集約を説明するのが最善です。ユーザーのコレクションを備えたソーシャルメディアプラットフォームを作成しているとします。各ユーザーの詳細を別のドキュメントに保存します。たとえば、

<code class="language-sql">SELECT book.title, publisher.name
FROM book
LEFT JOIN book.publisher_id ON publisher.id;</code>

必要な数のフィールドを追加できますが、すべてのMongoDBドキュメントには、一意の値を持つフィールドが必要です。 _id _idソーシャルネットワークには、ユーザーからの多数の洞察に満ちた更新を保存する投稿のコレクションが必要です。ドキュメントには、

フィールドに書いたユーザーへのテキスト、日付、評価、および参照を保存します:

user_id

すべてのユーザーが逆順に評価した「重要」と評価された最後の20の投稿を表示したいと考えています。返品された各ドキュメントには、テキスト、投稿の時間、および関連するユーザーの名前と国が含まれている必要があります。
<code class="language-json">{
  "_id": ObjectID("45b83bda421238c76f5c1969"),
  "name": "User One",
  "email": "userone@email.com",
  "country": "UK",
  "dob": ISODate("1999-09-13T00:00:00.000Z")
}</code>

mongodb集約クエリは、各操作を順番に定義するパイプライン演算子の配列に渡されます。まず、

フィルターを使用して、ポストコレクションから正しい評価ですべてのドキュメントを抽出する必要があります。

$match

演算子を使用して、一致するアイテムを逆順序で並べ替える必要があります。
<code class="language-json">{
  "_id": ObjectID("17c9812acff9ac0bba018cc1"),
  "user_id": ObjectID("45b83bda421238c76f5c1969"),
  "date": ISODate("2016-09-05T03:05:00.123Z"),
  "text": "My life story so far",
  "rating": "important"
}</code>

20の投稿しか必要ないので、$sortステージを適用して、mongodbが必要なデータのみを処理する必要があるようにすることができます。

<code class="language-javascript">{ "$match": { "rating": "important" } }</code>
新しい

オペレーターを使用して、ユーザーコレクションのデータを接続できるようになりました。 4つのパラメーターを備えたオブジェクトが必要です:$limit

<code class="language-javascript">{ "$sort": { "date": -1 } }</code>

:ドキュメントの検索フィールドを入力します$lookup

    :接続するコレクション
  • localField
  • collection fromで見つかったフィールド
  • :出力フィールドの名前。 foreignField from したがって、
  • オペレーターは次のとおりです
  • asこれにより、出力に新しいフィールドが作成されます。各値がユーザードキュメントと一致する配列が含まれています。
投稿には1つの著者しか持てないため、1対1の関係があります

。したがって、私たちの
<code class="language-javascript">{ "$limit": 20 }</code>
配列には常に1つのアイテムのみが含まれます。

オペレーターを使用して、それを分解に分解できます:userinfo

<code class="language-javascript">{ "$lookup": {
  "localField": "user_id",
  "from": "user",
  "foreignField": "_id",
  "as": "userinfo"
} }</code>
出力はより実用的な形式に変換され、他のオペレーターが適用できます。

post.user_id最後に、パイプラインのuser._idステージを使用して、テキスト、投稿の時間、ユーザーの名前、国:userinfoを返すことができます。

<code class="language-sql">SELECT book.title, publisher.name
FROM book
LEFT JOIN book.publisher_id ON publisher.id;</code>
すべてをまとめます

最終的な集計クエリは、投稿、順番にソート、最新の20項目に制限し、ユーザーデータを接続し、ユーザー配列を平らにし、必要なフィールドのみを返します。完全なコマンド:

<code class="language-json">{
  "_id": ObjectID("45b83bda421238c76f5c1969"),
  "name": "User One",
  "email": "userone@email.com",
  "country": "UK",
  "dob": ISODate("1999-09-13T00:00:00.000Z")
}</code>
結果は、最大20のドキュメントのコレクションです。たとえば、

<code class="language-json">{
  "_id": ObjectID("17c9812acff9ac0bba018cc1"),
  "user_id": ObjectID("45b83bda421238c76f5c1969"),
  "date": ISODate("2016-09-05T03:05:00.123Z"),
  "text": "My life story so far",
  "rating": "important"
}</code>
素晴らしい!ついにnosqlに切り替えることができます!

mongodb

は便利で強力ですが、この基本的な例でさえ、複雑な集約クエリが必要です。 SQLのより強力な結合句を置き換えることはできません。 MongoDBは、ユーザードキュメントが削除されている場合、孤児のポストドキュメントを保持します。 $lookup

理想的には、

オペレーターはめったに必要ありません。頻繁に必要な場合は、間違ったデータストアを使用している可能性があります...$lookup

リレーショナルデータがある場合は、リレーショナル(SQL)データベースを使用してください!

つまり、

はMongodb 3.2に人気のある追加です。 NOSQLデータベースで少量のリレーショナルデータを使用する場合、よりイライラする問題のいくつかを克服します。 $lookup Mongodb NoSQLデータベース(FAQ)

のJoinの使用に関するFAQ

SQL接続とMongoDB接続の違いは何ですか?

SQLデータベースでは、接続操作は、それらの間に関連する列に基づいて2つ以上のテーブルから行を組み合わせます。ただし、NOSQLデータベースとしてのMongoDBは、従来のSQL接続をサポートしていません。代わりに、MongoDBは、集約のステージと

ステージという同様の操作を実行する2つの方法を提供します。これらの方法では、複数のコレクションからのデータを単一の結果セットに結合することができます。

Mongodbの$lookupステージはどのように機能しますか? $graphLookup MongoDBの

ステージを使用すると、別のコレクション(「接続」コレクション)からドキュメントを接続し、接続されたドキュメントを入力ドキュメントに追加できます。 $lookup

MongoDB接続を使用して再帰検索を実行できますか?

$lookupはい、MongoDBは再帰検索のために$lookupフェーズを提供します。

ステージは、指定されたセットで再帰検索を実行し、検索の深さと幅を制限することを選択できます。これは、レベルの数が不明または変化する可能性のある階層データまたはグラフを照会するのに役立ちます。

MongoDB接続を使用するときにパフォーマンスを最適化する方法は?

$graphLookup MONGODB接続を使用する場合、次の戦略を検討します🎜>ステージ$graphLookupおよび

ステージでドキュメントをフィルタリングおよび変換します。

mongodbで複数のコレクションを接続できますか?

はい、集約パイプラインに複数の$lookupステージをリンクすることにより、複数のMongoDBコレクションを接続できます。各$lookupステージは、別のコレクションから入力ドキュメントに接続されたドキュメントを追加します。

mongoDB接続を使用するときにnullまたは欠損値を処理する方法は?

MongoDB接続を使用する場合、入力コレクションのドキュメントが「From」コレクションのドキュメントと一致しない場合、$lookupフェーズは空の配列を「As」フィールドに追加します。 $lookupフェーズの後に$matchフェーズを追加して、「フィールド」としてドキュメントをフィルタリングすることにより、これらのnullまたは欠損値を処理できます。

シャードコレクションとMongodb接続を使用できますか?

Mongodb 3.6から始まる

および$lookupステージは、シェルドセットを「From」セットに受け入れることができます。ただし、追加のネットワークオーバーヘッドにより、パフォーマンスは非剃毛コレクションほど良くない場合があります。 $graphLookup

mongodbで接続されたドキュメントを並べ替える方法は?

集約パイプラインの

フェーズの後に$lookupフェーズを追加することにより、MongoDBで接続されたドキュメントをソートできます。 $sortステージは、指定されたフィールドのドキュメントを昇順または降順でソートします。 $sort

メソッドを使用してmongodb接続を使用できますか? find()

いいえ、mongoDB接続は

メソッドでは使用できません。 find()および$lookup段階は、$graphLookupメソッドよりも高度なデータ処理機能を提供する集約フレームワークの一部です。 find()

mongodb接続の障害をデバッグまたはトラブルシューティングする方法は?

MongoDB接続の障害をデバッグまたはトラブルシューティングするには、

メソッドを使用して、集約パイプラインの実行計画を分析できます。 explain()メソッドは、処理されたドキュメントの数、費やした時間、インデックスの使用を含む段階に関する詳細な情報を提供します。 explain()

以上がMongoDB NoSQLデータベースに参加するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。