我有一些数据,产品,它们具有属性值和该属性的id
。
属性的标签位于同一个集合中,但使用type: "attribute"
而不是`type:“product”。我需要加入这些,所以我有产品,包括属性的标签和它们的价值。
我有非常简单的示例数据她:https://gist.github.com/flowl/632243bca8f2907a672f66920ea0f793
我的聚合看起来像这样:
db.input.aggregate([
{
$unwind: "$attributes"
},
{
$lookup: {
from: "input",
localField: "attributes.id",
foreignField: "attributeId",
as: "attributeLabels"
}
},
{
$match: { "output": { $ne: [] } }
},
{
$group: {
_id: "$productId",
product: { "$first": "$$CURRENT"}
}
},
{ $group : { _id : "$product._id", data: { $push: "$$ROOT" } } }
]);
问题是,我想重新格式化输出:
{
"_id" : ObjectId("5899925339db9185f13432c4"),
"data" : [
{
"_id" : 111,
"product" : {
"_id" : ObjectId("5899925339db9185f13432c4"),
"type" : "product",
"productId" : 111,
"attributes" : {
"id" : 1,
"value" : "L"
},
"attributeLabels" : [
{
"_id" : ObjectId("5899927539db9185f13432cb"),
"type" : "attribute",
"attributeId" : 1,
"label" : "Size"
}
]
}
}
]
}
对此:
{
"_id" : ObjectId("5899925339db9185f13432c4"),
"type" : "product",
"productId" : 111,
"attributes" : [
{
"_id" : ObjectId("5899927539db9185f13432cb"),
"type" : "attribute",
"attributeId" : 1,
"label" : "Size",
"value" : "L"
}
]
}
答案 0 :(得分:1)
您可以使用以下聚合。
这会将SqlDataSourceEnumerator
数组中的id
字段值替换为attributes
值。
响应不完全相似,但它包含$lookUp
的所有属性值。
product
样本回复
db.input.aggregate([{
$unwind: "$attributes"
}, {
$lookup: {
from: "input",
localField: "attributes.id",
foreignField: "attributeId",
as: "attributes.id"
}
}, {
$match: {
"attributes.id": {
$ne: []
}
}
}, {
$unwind: "$attributes.id"
}, {
$group: {
_id: "$_id",
type: {
"$first": "$type"
},
productId: {
"$first": "$productId"
},
attributes: {
"$push": "$attributes"
}
}
}]);