2017-01-26 7 views
0

私はそのようなのようなコレクションを持っている:Mongo、検索後の参加方法

purchases = [ 
    {_id: 0, user_id: 3, product_ids: [ObjectId_1, ObjectId_2... etc]}, 
    {_id: 1, user_id: 4, product_ids: [ObjectId_3, ObjectId_2... etc]} 
] 

私はUSER_IDにインデックスを持っています。基本的には、ユーザーのすべての購入を製品のデータで取得したいと考えています。次のようなもの:

purchases = [ 
    {_id: 0, user_id: 5, products: [{name: 'hammer'}, {name: 'drill'}... etc]}, 
    {_id: 1, user_id: 5, products: [{name: 'bat'}, {name: 'ball'}... etc]} 
] 

どうすればよいですか?

私は$lookupを見ていますが、$lookupがテーブル全体にあるようです。最初の購入リストを見つけてから、製品IDを見つけることはテーブル全体の小さなサブセットです...

find()を購読コレクションで実行するのは非効率的です一部のproduct_idが複製されるため、製品IDにはfindが返されます。

mongoでこの結合を行う適切な方法は何ですか?

+0

'$ lookup'は、等価条件で左外部結合を行い、一致するすべてのドキュメントを他のコレクションから引き出します。なぜそれがテーブル全体にあると思うのか分かりません。 – Veeram

+0

@Veeramコマンドは 'db.collection.aggregate'です。それはそれがコレクション全体にあることを暗示していませんか?私の例では、ユーザーIDと一致する購入コレクションに2つのエントリがあるため、結合ではわずかな製品IDしか取得できません。 'db.purchases.aggregate'を実行すると、購入コレクション全体で左外部結合を行うことになりますか? –

+0

あなたは '$ lookup'を実行して購入をフィルタリングする前に' $ match'を必要とします。回答を追加しました。 – Veeram

答えて

0

の前に$matchを試すことができます。

db.purchases.aggregate({ 
    $match: { 
     "user_id": 5 
    } 
}, { 
    $unwind: "$product_ids" 
}, { 
    $lookup: { 
     from: "products", 
     localField: "product_ids", 
     foreignField: "_id", 
     as: "products" 
    } 
}) 
+0

タイはそれを見ませんでした。 –

関連する問題