2017-04-05 3 views
1

mongodbの3つのテーブルで集計クエリを使用したい場合 DBデータを格納する3つのテーブルをリストしました。使用したクエリは ですが、出力が得られません。mongodbから詳細を取得するには、配列と配列の配列の集約単一クエリを使用する方法

注文表Iは、1注文を作成し、そのオブジェクトの "注文の詳細"

"order_details":[ 

{ 
    "product_unique_id" : 10 
    "items":[ 
    { 
     "item_unique_id" : 1 
     "quantity":2, 
    }, 
    { 
     "item_unique_id" : 2 
     "quantity":4, 
    } 
    ] 
}, 
{ 
    "product_unique_id" : 11 
    "items":[ 
    { 
     "item_unique_id" : 1 
     "quantity":1, 
    }, 
    { 
     "item_unique_id" : 3 
     "quantity":3, 
    }, 
    { 
     "item_unique_id" : 4 
     "quantity":2, 
    } 
    ] 
} 
] 

製品表

Data 1 => {"unique_id":10, "product_name":"Product10", "product_visible":true} 
Data 2 => {"unique_id":11, "product_name":"Product11", "product_visible":false} 
Data 3 => {"unique_id":12, "product_name":"Product13", "product_visible":true} 
... up to N 

項目表持って注文テーブルに

Data 1 => {"unique_id":1, "item_name":"Item1", "price":17} 
Data 2 => {"unique_id":2, "item_name":"Item2", "price":9} 
Data 3 => {"unique_id":3, "item_name":"Item3", "price":34} 
Data 4 => {"unique_id":4, "item_name":"Item4", "price":78} 
Data 5 => {"unique_id":5, "item_name":"Item5", "price":26} 

私が欲しい

以下OUTPUTは、私がそのためのいくつかのクエリを使用されるが、OUTはPUT

"order_details":[ 
{ 
    "product_unique_id" : 10, 
    "product_detail": {"unique_id":10, "product_name":"Product10", "product_visible":true}, 
    "items":[ 
    { 
     "item_unique_id" : 1 
     "quantity":2, 
     "item_details":{"unique_id":1, "item_name":"Item1", "price":17} 
    }, 
    { 
     "item_unique_id" : 2 
     "quantity":4, 
     "item_details":{"unique_id":2, "item_name":"Item2", "price":9} 
    } 
    ] 
}, 
{ 
    "product_unique_id" : 11, 
    "product_detail": {"unique_id":11, "product_name":"Product11", "product_visible":false}, 
    "items":[ 
    { 
     "item_unique_id" : 1 
     "quantity":1, 
     "item_details":{"unique_id":1, "item_name":"Item1", "price":17} 
    }, 
    { 
     "item_unique_id" : 3 
     "quantity":3, 
     "item_details":{"unique_id":3, "item_name":"Item3", "price":34} 
    }, 
    { 
     "item_unique_id" : 4 
     "quantity":2, 
     "item_details":{"unique_id":4, "item_name":"Item4", "price":78} 
    } 
    ] 
} 
] 

ISように私は順序テーブルに集計クエリを実行し、応答を行いたい場合複数の項目を使用する場合

var product_query = { 
    $lookup: 
     { 
     from: "products", 
     localField: "order_details.product_unique_id", 
     foreignField: "unique_id", 
     as: "order_details.product_detail" 
     } 
}; 


var group_product = { 
    $group: { 
     _id: '$order_details' 
    } 
} 

var item_query = { 
    $lookup: 
     { 
     from: "items", 
     localField: "order_details.items.item_unique_id", 
     foreignField: "unique_id", 
     as: "order_details.item_details" 
     } 
}; 

Order.aggregate([ 
    {$unwind: "$order_details"}, 
    {$unwind: "$order_details.items"}, 
    product_query, 
    item_query, 
    group_product 

], function (error, order) { 
    // OUT PUT HERE 
}); 

答えて

1

以下のアグリゲーションパイプラインを試すことができます。私はあなたが3.2バージョンであると仮定しています。

かなり標準的なものです。それぞれitemsproductsの場合、それぞれ$unwind + $lookup + $group回のカップルが必要であり、残りの部分は元の構造に戻すためのレスポンスをフォーマットしています。

db.orders.aggregate([ 
    {$unwind: "$order_details"}, 
    {$unwind: "$order_details.items"}, 
    {$lookup:{ 
     from: "items", 
     localField: "order_details.items.item_unique_id", 
     foreignField: "unique_id", 
     as: "order_details.items.item_details" 
     } 
    }, 
    {$unwind: "$order_details.items.item_details"}, 
    { $group: { 
     _id: {order_id:'$_id', product_unique_id:"$order_details.product_unique_id"}, 
     "items": {$push:"$order_details.items"} 
     } 
    }, 
    {$lookup:{ 
     from: "products", 
     localField: "_id.product_unique_id", 
     foreignField: "unique_id", 
     as: "_id.product_detail" 
     } 
    }, 
    {$unwind: "$_id.product_detail"}, 
    {$project:{ 
     "order_detail.product_unique_id":"$_id.product_unique_id", 
     "order_detail.product_detail":"$_id.product_detail", 
     "order_detail.items":"$items" 
     } 
    }, 
    {$group: { 
     _id: '$_id.order_id', order_details:{$push:"$order_detail"} 
     } 
    } 
]) 

このパイプラインは、3.4バージョンでさらに改善することができます。私はあなたが3.4バージョンのために必要な場合、余分な編集を追加することができます。

+0

ありがとうございました。 私の仕事です。驚くばかり。 パイプラインクエリを共有できますか? –

+0

ようこそ。 3.4バージョンのパイプラインクエリですか? – Veeram

関連する問題