javascript - 如何按子文档分组并获取 value 字段的唯一值?
问题描述
这是我的数据库集合:
{"productId" : 1,
"isVariant": 1,
"isComplete" : 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",
"isVariation" : 0
}
]
},
{"productId" : 2,
"isVariant": 1,
"isComplete" : 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",
"isVariation" : 0
}
]
},
{"productId" : 3,
"isVariant": 1,
"isComplete" : 0,
"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",
"isVariation" : 0
}
]
},
{"productId" : 4,
"isVariant": 1,
"isComplete" : 0,
"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",
"isVariation" : 0
}
]
}
现在我想只发送isVariation
不为 0 的属性的数据。我还想发送每个属性的变量值 where isComplete =1
。因此结果应该是这样的
result : [{
"id": 3,
"name": "Capacity",
"value": [
"500 GB",
"1 TB"
]
}, {
"id": 4,
"name": "Form Factor",
"value": [
"5 inch"
]
}]
上述结果没有 2.5 英寸的值,isComplete
因为本文档的值为 0。谁能帮我查询
解决方案
$match
isComplete
是 1$project
显示必填字段$unwind
解构attributeSet
数组$match
attributeSet.isVariation
不为 0$group
通过attributeSet.id
并获得第一name
并获得独特的value
使用$addToSet
db.collection.aggregate([
{ $match: { isComplete: 1 } },
{
$project: {
_id: 0,
attributeSet: 1
}
},
{ $unwind: "$attributeSet" },
{ $match: { "attributeSet.isVariation": { $ne: 0 } } },
{
$group: {
_id: "$attributeSet.id",
name: { $first: "$attributeSet.name" },
value: { $addToSet: "$attributeSet.value" }
}
}
])
您的查询中不需要 $project 阶段,我已添加,因为这将优化您的查询性能。
推荐阅读
- c# - 加载 DataTable 后强制将新的自动增量列放入第 0 列
- c# - 通过 Azure 门户中的“身份验证”刀片与 Startup.cs 中的手动保护功能应用程序
- c - ZFS 快照(或其他文件系统快照)能否恢复文件系统内存组件?
- javascript - 如何在使用 AWS ECS FARGATE 时为 Web 应用程序存储上传的文件
- haskell - Haskell List Comprehension:List 中用作谓词的布尔项
- javascript - 将数组增加到最大项目
- c++ - 使用概念检查成员函数
- php - PHP-GD 已安装,但在 wordpress 安装期间需要
- c# - 无法向空 TcpClient 发送数据(检查是否调用了 Connect)”
- javascript - 如何从网站获取html数据