我有两个集合(如下所示),我只想将供应商名称附加到产品数组中的每个文档中。供应商名称存储在第二个集合中,并且可以由产品数组中的vendorId链接。
order
{
_id: objectId // objectId
product: [{
sku: 123,
supplierId: 123, // objectId
qty: 10
},
{
sku: 123456,
supplierId: 1234,
qty: 5
}]
}
}
supplier
{
_id: 1234, // objectId
name: "Supplier 1"
},
{
_id: 123,
name: "Supplier 2"
}
所需的输出如下所示
{
_id: objectId // objectId
product: [{
sku: 123,
supplierId: 123, // objectId
qty: 10,
name: Supplier 2
},
{
sku: 123456,
supplierId: 1234, // objectId
qty: 5,
name: Supplier 1
}]
}
}
我的尝试看起来像这样,结果导致两个单独的文档,其中正确的供应商针对正确的产品。不知道我是朝着正确的方向前进还是下一步去。接下来是分组还是项目步骤?请指教
[{ $unwind: { path: '$product'} },
{ $lookup: { from: 'supplier', localField: 'product.supplierId', foreignField: '_id', as: 'sup'} }
, { $unwind: { path: '$sup'} }]
答案 0 :(得分:0)
您可以在3.4中使用以下汇总。
$addFields
,将名称从供应商文档添加到产品中,然后$group
,将产品收集回阵列中。
db.order.aggregate([
{"$unwind":"$product"},
{"$lookup":{"from":"supplier","localField":"product.supplierId","foreignField":"_id","as":"supplier"}},
{"$unwind":"$supplier"},
{"$addFields":{"product.name":"$supplier.name"}},
{"$group":{"_id":"$_id","product":{"$push":"$product"}}}
]