首页 > 解决方案 > 如何按子文档分组并获取 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。谁能帮我查询

标签: javascriptnode.jsmongodbmongooseaggregation-framework

解决方案


  • $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 阶段,我已添加,因为这将优化您的查询性能。


推荐阅读