2016-01-06 11 views
16

$lookupはMongoDB 3.2で新しく追加されました。同じデータベース内の非共有コレクションへの左外部結合を実行して、処理のために「結合」コレクションから文書をフィルタリングします。

$lookupを使用するには、fromコレクションをシャードできません。

一方、シャーディングは、有効な水平スケーリング手法です。

一緒に使用するのがベストプラクティスですか?

+0

$ルックアップ段階では、データベースのプライマリシャード上で実行する必要があります。 "from"コレクションも断片化されていないので、同じサーバー上にあり、結合はローカルで実行できます。異なるマシン間での結合を避ける必要があります。これはNoSQLです;-)良い解決策はないと思います。アプリケーションの結果を繰り返し処理したいのですか、または保存しますか?最初のケースでは、すべてのドキュメントのループで検索操作を行う必要があるかもしれません。 2番目のケースでは、MapReduceを使用することができます:http://tebros.com/2011/07/using-mongodb-mapreduce-to-join-2-collections/ – yoooshi

答えて

14

あなたが引用したドキュメントに示すように、$lookupはシャードされたコレクションに使用できません。だからベストプラクティスの回避策は、別々のクエリで自分自身でルックアップを実行することです。

  1. aggregateクエリを実行します。
  2. クエリ結果の「localField」値を配列に引き出します。おそらくArray#mapを使用します。
  3. {foreignField: {$in: localFieldArray}}
  4. ようなクエリは、何が必要なフォーマットにあなたの結果をマージ使用して、コレクション「から」に対するfindクエリを実行します。

スケーラビリティのためにコレクションをシャーディングしないように制限しないでください。ちょうどルックアップ機能を自分で実行してください。

+0

したがって、 '$ lookup'は現在かなり制限されていますか? –

+1

私はそれほど遠くに行きません。参照されたデータを非共有コレクションからサーバー側に引き出す機能はまだまだ有効ですが、これはまだ強力なツールです。しかし、ええ、シャードコレクションからデータを引き出すことができないことは重要な制限です。 – JohnnyHK

関連する問題