mongodb - 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'} }]
解决方案
您可以在 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"}}}
]
推荐阅读
- sql - 如何在另一个表中的 2 个日期之间获得成本下降?
- javascript - 比较并添加一行代码?
- google-cloud-platform - Terraform:尝试使用列表创建一系列子网 cidr,但出现错误“需要字符串”
- node.js - 在 nodejs 中连接到 mongodb 时出现错误
- amazon-web-services - 在 AWS EMR PySpark 作业中管理机密
- pyspark - 带有时间戳名称的 pySpark 输出文件
- c# - 使用转换器将颜色绑定到布尔值不会更新
- azure - 从具有动态外部 IP 的计算机连接到 Azure SQL Server
- ios - 如何按日期字符串对 TableViewCells 进行排序
- powershell - 为什么我不能在批处理文件中运行这个 powershell 脚本?