如果每个产品是变体,如何返回该产品的变体值



我在MongoDB中有一个类似的数据库

{"productId" : 1,
"isVariant": 1,
"variantId" : 1,
"attributeSet" : [ 
{
"name" : "Capacity",
"value" : "500 GB",
"id" : 3
}, 
{
"name" : "Form Factor",
"value" : "5 inch",
"id" : 4
}, 
{
"id" : 5,
"name" : "Memory Components",
"value" : "3D NAND"
}
]
},
{"productId" : 2,
"isVariant": 1,
"variantId" : 1,
"attributeSet" : [ 
{
"name" : "Capacity",
"value" : "1 TB",
"id" : 3
}, 
{
"name" : "Form Factor",
"value" : "5 inch",
"id" : 4
}, 
{
"id" : 5,
"name" : "Memory Components",
"value" : "3D NAND"
}
]
},
{"productId" : 3,
"isVariant": 1,
"variantId" : 1,
"attributeSet" : [ 
{
"name" : "Capacity",
"value" : "500 GB",
"id" : 3
}, 
{
"name" : "Form Factor",
"value" : "2.5 inch",
"id" : 4
}, 
{
"id" : 5,
"name" : "Memory Components",
"value" : "3D NAND"
}
]
},
{"productId" : 4,
"isVariant": 1,
"variantId" : 1,
"attributeSet" : [ 
{
"name" : "Capacity",
"value" : "1 TB",
"id" : 3
}, 
{
"name" : "Form Factor",
"value" : "2.5 inch",
"id" : 4
}, 
{
"id" : 5,
"name" : "Memory Components",
"value" : "3D NAND"
}
]
}

现在我想返回productId1和3中500 GB的数据响应应该是这样的:

variantValues : [{
attributeValue : "500 GB",
data : [
{productId : 1},
{productId : 3}
]},
{
attributeValue : "1 TB",
data : [
{productId : 2},
{productId : 4}
]},
{
attributeValue : "2.5 inch",
data : [
{productId : 3},
{productId : 4}
]},
{
attributeValue : "5 inch",
data : [
{productId : 1},
{productId : 2}
]}]

我有可能存储在另一个集合中的variantPossible值。我存储的值如下:

"VariantValues" : {
"3" : [ 
"500 GB", 
"1 TB"
],
"4" : [ 
"2.5 inch", 
"5 inch"
]
},

如果每个产品是具有上述格式的变体,我想返回该产品的变体值。有人能帮我吗。

您应该能够在聚合管道中使用$unwind$group来实现这一点。这首先将每个属性展平为一个文档,并在这些文档上按属性值进行分组。

最后,您可以使用$project来获得attributeValue:所需的名称

db.collection.aggregate([
{
$unwind: "$attributeSet"
},
{
$group: {
_id: "$attributeSet.value",
data: {
"$addToSet": {
productId: "$productId"
}
}
}
},
{
"$project": {
_id: 0,
data: 1,
attributeValue: "$_id"
}
}
])

请参阅mongoplayground上的简化示例:https://mongoplayground.net/p/VASadZnDedc

最新更新