2017-04-05 48 views
1

我想在mongodb上的三個表中使用聚合查詢, 我列出了存儲數據庫數據的三個表,並且我向您發送了我使用的查詢, 但輸出沒有得到我想要的結果。如何在側邊數組中使用聚合單個查詢來獲取來自mongodb的詳細信息?

順序表

以表我有一個創造秩序,在該對象中 「訂單明細」

"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我要的是

"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} 
    } 
    ] 
} 
] 

我使用了一些查詢這一點,但OUT PUT隨着多件物品

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

相關問題