首页 > 解决方案 > Mongodb聚合将集合中的字段附加到另一个集合中数组中的每个文档

问题描述

我有两个类似的集合(见下文),我只想将供应商名称附加到产品数组中的每个文档。供应商名称存储在第二个集合中,可以通过 product 数组中的 supplierId 链接。

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

标签: mongodbaggregation-framework

解决方案


您可以在 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"}}}
]

推荐阅读