0

mongoDB集約で私を助けてください。以下は私が次にしたいことです:大きなデータに対するMongo集約フレームワーク

私はコレクションAを持っています。 Aからの文書には、のようなオブジェクトを表す:

{ 
    nameA: 'first', 
    items: [ 
    'item1', 
    'item2', 
    'item3', 
    'item4' 
    ] 
} 

をそして私のような文書とコレクションB持っている:1つのクエリでそれを行う方が良いでしょうので、私は、ビッグデータを扱う

[ 
    { 
     item: 'item3', 
     info: 'info1' 
    }, 
    { 
     item: 'item3', 
     info: 'info2' 
    }, 
    { 
     item: 'item3', 
     info: 'info3' 
    } 
] 

を。我々はすでに収集A.からのすべてのデータを持っていることを想像し、私は次の構造の結果を得るために、収集Bのクエリを作成したいと思います:

{ 
    'first'/*nameA*/: ['info1', 'info2', 'info3'], 
    .... 
} 

はどのようにMongoDBの集計で所望の結果を達成するのですか?

+0

これは非常に便利な設計ではありません、モンゴが参加し、$のルックアップがあることはできませんのでご注意左結合のように操作するには、集計パイプラインで$ lookupのドキュメントをチェックしてください。 –

答えて

1

Rahul Kumar氏のコメントによれば、設計はリレーショナルデータベーススキーマ設計に傾いており、効率的なMongoDBを設計することは非常に困難です。次のように

はしかし、集約フレームワークの$lookup段階を活用することで、あなたが探している機能を実現することが可能です:あなたは正常化最初$unwind段階で

db.A.aggregate([ 
    { 
     $unwind: { 
      path: "$items" 
     } 
    }, 
    { 
     $lookup: { 
      from: "B", 
      localField: "items", 
      foreignField: "item", 
      as: "item_info" 
     } 
    }, 

    { 
     $unwind: { 
      path: "$item_info" 
     } 
    }, 

    { 
     $group: { 
      _id: "$nameA", 
      item_info: { $addToSet: "$item_info.info" } 
     } 
    } 
]); 
  1. items配列を collection Aに出力すると、次の出力に渡すことができます。 ステージ

  2. あなたは左を作るE $lookupステージが同じデータベースの一部である2つのコレクション 間の結合、第二$unwind段階でcollection B

  3. から アイテム情報を取得するために使用される、この場合、あなたはから を抽出されたデータを正規化$group段階で、最後collection A

  4. に対応 アイテムにマッピングしたcollection Bから オブジェクトを含む配列を平坦化するためにcollection Bをグループ全結果のエントリをnameAで設定し、一意のアイテム情報の配列 の値を作成します。アイテム情報の値がすべて の重複した出現をすべて表示されるようにしたい場合は、 アキュムレータを$pushに置き換えることができます。以下は

あなたが提供するコレクションで上記の集約パイプラインを実行した結果である:

{ "_id" : "second", "item_info" : [ "info3", "info2", "info1" ] } 
{ "_id" : "first", "item_info" : [ "info3", "info2", "info1" ] } 
+0

ええええええええええええええええええええええええええええええええええええええええええええええええええええええええって、本当に助けていただきありがとうございます!どうもありがとうございました! –

関連する問題