ホームページ >テクノロジー周辺機器 >IT業界 >MongoDB NoSQLデータベースに参加する
コアポイント
$lookup
$lookup
(ドキュメントの検索フィールドを入力)、localField
(接続するコレクション)、from
>)andforeignField
(出力フィールドの名前)。このオペレーターは、集約クエリで使用して、投稿を一致させ、順番に並べ替え、アイテムの数を制限し、ユーザーデータを接続し、ユーザー配列をフラット化し、必要なフィールドのみを返すことができます。 from
as
MongoDBの$lookup
$lookup
彼のピアレビューヘルプをありがとう、ジュリアン・モッツに感謝します。
言い換えれば、本のテーブルには、パブリッシャーテーブルの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つ以上のセットで左翼に結合した操作を実行できる新しいオペレーターを導入しました。しかし、問題があります...
$lookup
総操作でのみ使用することができます。それを、結果をクエリ、フィルター、およびグループの結果を照会した一連のオペレーターのパイプラインと考えてください。 1つの演算子の出力は、次の演算子への入力として使用されます。
集約は、単純なルックアップクエリよりも理解するのが難しく、通常は遅くなります。ただし、それらは強力であり、複雑な検索操作にとって貴重なオプションです。
例を使用して集約を説明するのが最善です。ユーザーのコレクションを備えたソーシャルメディアプラットフォームを作成しているとします。各ユーザーの詳細を別のドキュメントに保存します。たとえば、
<code class="language-sql">SELECT book.title, publisher.name FROM book LEFT JOIN book.publisher_id ON publisher.id;</code>
必要な数のフィールドを追加できますが、すべてのMongoDBドキュメントには、一意の値を持つフィールドが必要です。 _id
ソーシャルネットワークには、ユーザーからの多数の洞察に満ちた更新を保存する投稿のコレクションが必要です。ドキュメントには、
user_id
<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
from
で見つかったフィールド
foreignField
from
したがって、as
これにより、出力に新しいフィールドが作成されます。各値がユーザードキュメントと一致する配列が含まれています。
と
。したがって、私たちの<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>すべてをまとめます
<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に切り替えることができます!
は便利で強力ですが、この基本的な例でさえ、複雑な集約クエリが必要です。 SQLのより強力な結合句を置き換えることはできません。 MongoDBは、ユーザードキュメントが削除されている場合、孤児のポストドキュメントを保持します。 $lookup
オペレーターはめったに必要ありません。頻繁に必要な場合は、間違ったデータストアを使用している可能性があります...$lookup
リレーショナルデータがある場合は、リレーショナル(SQL)データベースを使用してください!つまり、
はMongodb 3.2に人気のある追加です。 NOSQLデータベースで少量のリレーショナルデータを使用する場合、よりイライラする問題のいくつかを克服します。 $lookup
Mongodb NoSQLデータベース(FAQ)
Mongodbの$lookup
ステージはどのように機能しますか? $graphLookup
MongoDBの
$lookup
はい、MongoDBは再帰検索のために$lookup
フェーズを提供します。
$graphLookup
MONGODB接続を使用する場合、次の戦略を検討します🎜>ステージ$graphLookup
および
はい、集約パイプラインに複数の$lookup
ステージをリンクすることにより、複数のMongoDBコレクションを接続できます。各$lookup
ステージは、別のコレクションから入力ドキュメントに接続されたドキュメントを追加します。
MongoDB接続を使用する場合、入力コレクションのドキュメントが「From」コレクションのドキュメントと一致しない場合、$lookup
フェーズは空の配列を「As」フィールドに追加します。 $lookup
フェーズの後に$match
フェーズを追加して、「フィールド」としてドキュメントをフィルタリングすることにより、これらのnullまたは欠損値を処理できます。
および$lookup
ステージは、シェルドセットを「From」セットに受け入れることができます。ただし、追加のネットワークオーバーヘッドにより、パフォーマンスは非剃毛コレクションほど良くない場合があります。 $graphLookup
フェーズの後に$lookup
フェーズを追加することにより、MongoDBで接続されたドキュメントをソートできます。 $sort
ステージは、指定されたフィールドのドキュメントを昇順または降順でソートします。 $sort
find()
メソッドでは使用できません。 find()
および$lookup
段階は、$graphLookup
メソッドよりも高度なデータ処理機能を提供する集約フレームワークの一部です。 find()
メソッドを使用して、集約パイプラインの実行計画を分析できます。 explain()
メソッドは、処理されたドキュメントの数、費やした時間、インデックスの使用を含む段階に関する詳細な情報を提供します。 explain()
以上がMongoDB NoSQLデータベースに参加するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。