我有许多Shop
文档,每个文档都包含一个字段products
,该字段是一组对象,其中键是产品ID,值是库存数量:
{ products: [{"a": 3}, {"b": 27}, {"c": 4}] }
我有一个集合Products
,其中每个产品都有一个包含productId
,name
等的文档:
{ productId: "a", "name": "Spanner"}
我想提取/汇总/加入这些商品的产品信息。我知道当字段是单个ID时该怎么做,并且我已经看到this answer描述了如何对ID数组进行此操作。但是我有些麻烦,如何处理包含ID的对象数组。
所需的输出:
{
products: [
{ {productId: "a", "name": "Spanner"}: 3 }
]
}
(不,切换到关系数据库不在我的控制范围之内。)
答案 0 :(得分:2)
我想,如果您想使用ID作为参考,请尽量避免将其作为对象键放置,而应将其作为对象属性,例如{产品:[{“ productId”:$ _id,“ quantity”:3}]} ,这可能是拒绝投票的原因。
但是,如果您无法更改它,则可以聚合使用$objectToArray来转换数组。
还有一件事,您期望的输出是不真实的,因为js中的对象属性不能是对象。
尝试:
db.Shop.aggregate(
// Pipeline
[
// Stage 1
{
$unwind: {
path : "$products"
}
},
// Stage 2
{
$project: {
products: { $objectToArray: "$products" }
}
},
// Stage 3
{
$unwind: {
path : "$products"
}
},
// Stage 4
{
$project: {
productId: "$products.k",
productQuantity: "$products.v"
}
},
// Stage 5
{
$lookup: {
"from" : "products",
"localField" : "productId",
"foreignField" : "productId",
"as" : "products"
}
},
// Stage 6
{
$unwind: {
path : "$products"
}
},
// Stage 7
{
$project: {
productId: "$productId",
productQuantity: "$productQuantity",
productName: "$products.name"
}
},
]);
祝你好运