【问题标题】:How to group by sub documents and get unique value of value field?如何按子文档分组并获取 value 字段的唯一值?
【发布时间】:2021-04-10 22:17:02
【问题描述】:

这是我的数据库集合:

{"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 的属性的数据。我还想发送isComplete =1 的每个属性的变量值。因此结果应该是这样的

 result : [{
     "id": 3,
     "name": "Capacity",
     "value": [
         "500 GB",
         "1 TB"
     ]
  }, {
     "id": 4,
     "name": "Form Factor",
     "value": [
         "5 inch"
      ]
}]

上述结果没有 2.5 英寸的值,因为此文档的 isComplete 为 0。谁能帮我查询一下

【问题讨论】:

标签: javascript node.js mongodb mongoose aggregation-framework


【解决方案1】:
  • $matchisComplete是1
  • $project 显示必填字段
  • $unwind解构attributeSet数组
  • $match attributeSet.isVariation 不是 0
  • $group by attributeSet.id 并获得第一 name 并使用 $addToSet 获得唯一的 value
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" }
    }
  }
])

Playground

您的查询中不需要 $project 阶段,我已添加,因为这将优化您的查询性能。

【讨论】:

    猜你喜欢
    • 2016-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-22
    • 2021-11-15
    • 1970-01-01
    • 2020-05-27
    • 1970-01-01
    相关资源
    最近更新 更多