首页 > 解决方案 > MongoDB按数组中的元素分组

问题描述

我有一个看起来像这样的集合:

{
  "id": "id1",
  "tags": ['a', 'b']
},
{
  "id": "id2",
  "tags": ['b', 'c']
},
{
  "id": "id3",
  "tags": ['a', 'c']
}

如何进行按“标签”数组中的每个元素分组的查询,所以结果如下所示?:

{'a': 2},
{'b': 2},
{'c': 2}

(其中 2 是它出现的次数,计数)。谢谢你的帮助!

标签: mongodbmongodb-query

解决方案


您可以使用此聚合查询:

  • 首先$unwind要解构访问类似对象的数组。
  • 然后$group乘以1tags得到$sum总数。
  • 最后使用$replaceRootwith$arrayToObject来获得所需的输出。
db.collection.aggregate([
  {
    "$unwind": "$tags"
  },
  {
    "$group": {
      "_id": "$tags",
      "count": {
        "$sum": 1
      }
    }
  },
  {
    "$replaceRoot": {
      "newRoot": {
        "$arrayToObject": [
          [
            {
              "k": "$_id",
              "v": "$count"
            }
          ]
        ]
      }
    }
  }
])

这里的例子

作为补充,如果您想获得排序值(a,b,c ...),您可以像这个示例$sort一样添加阶段


推荐阅读