我想在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}
我想在订单表中运行聚合查询,并希望响应如下
输出我想要
"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}
}
]
}
]
我使用了一些与多个项目相关的查询
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
});
答案 0 :(得分:1)
您可以尝试以下聚合管道。我假设你是3.2版本。
非常标准的东西。对于$unwind + $lookup + $group
和items
,您需要products
两次,其余的是格式化响应以将所有内容放回原始结构中。
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版本,我可以添加额外的编辑。