MongoDB按字段分组,用于子文档中的不同数组元素

时间:2016-06-27 16:29:53

标签: mongodb mongodb-aggregation

我的文档结构如下:

{
    "_id" : ObjectId("576c5402eef7285c58f6a681"),
    "asOfDate" : 20160602,
    "universe" : [ 
        {
            "memberOf" : [ 
                "group1", 
                "group2", 
                "group3", 
                "group4", 
                "group5"
            ],
            "personName" : "John"
        }, 
        {
            "memberOf" : [ 
                "group22", 
                "group2", 
            ],
            "personName" : "Mary"
        }]
},
{
    "_id" : ObjectId("576c5402eef7285c58f6a684"),
    "asOfDate" : 20160603,
    "universe" : [ 
        {
            "memberOf" : [ 
                "group1", 
                "group2", 
                "group6"
            ],
            "personName" : "Chris"
        }, 
        {
            "memberOf" : [ 
                "group7", 
                "group5", 
            ],
            "personName" : "Jack"
        }]
}

我正在尝试为集合中的每个universe.memberOf获取不同asOfDates的列表。所需的输出如下。我能想出的唯一方法是为每个日期运行一个不同的。但是我必须为每个日期循环,这可能效率不高。

{ 
    20160602 : ["group1", "group2", "group3", "group4", "group5", "group22"],

    20160603 : ["group1", "group2", "group6", "group7", "group5"]
}

1 个答案:

答案 0 :(得分:0)

使用聚合管道,它可能看起来像

db.getCollection('fooBar').aggregate([
  {
      $unwind: {
         path: "$universe"
      }
  },
  {
      $unwind: {
         path: "$universe.memberOf"
      }
  },
  {
     $group: {
         _id: "$asOfDate",
         memberOf: {
             $addToSet: "$universe.memberOf"
         }
     }
  }
])

将导致

/* 1 */
{
    "_id" : 20160603,
    "memberOf" : [ 
        "group5", 
        "group7", 
        "group6", 
        "group2", 
        "group1"
    ]
}

/* 2 */
{
    "_id" : 20160602,
    "memberOf" : [ 
        "group22", 
        "group5", 
        "group3", 
        "group1", 
        "group2", 
        "group4"
    ]
}