Mongodb Aggregation将集合中的字段追加到另一个集合中数组中的每个文档中

时间:2018-08-08 20:24:58

标签: mongodb aggregation-framework

我有两个集合(如下所示),我只想将供应商名称附加到产品数组中的每个文档中。供应商名称存储在第二个集合中,并且可以由产品数组中的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'} }]

1 个答案:

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