MongoDB按数组中的元素分组

Posted

技术标签:

【中文标题】MongoDB按数组中的元素分组【英文标题】:MongoDB group by elements in array 【发布时间】:2021-12-22 14:27:23 【问题描述】:

我有一个如下所示的集合:


  "id": "id1",
  "tags": ['a', 'b']
,

  "id": "id2",
  "tags": ['b', 'c']
,

  "id": "id3",
  "tags": ['a', 'c']


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

'a': 2,
'b': 2,
'c': 2

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

【问题讨论】:

【参考方案1】:

您可以使用此聚合查询:

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

例如here

作为补充,如果您想获得排序值(a、b、c...),您可以添加$sort 阶段,如this example

【讨论】:

非常感谢您的完整回答!这对我帮助很大

以上是关于MongoDB按数组中的元素分组的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB按数组内部元素分组

MongoDB 对数组中的元素进行分组

Mongodb按内部元素分组

Mongodb:按元素分组并根据条件显示子文档计数并按日期对文档进行排序

MongoDB统计文档(Document)的数组(Array)中的各个元素出现的次数

如何使用 MongoDB 根据数组元素对记录进行分组