1

我有以下文档结构:

{
    "_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"]
}
4

1 回答 1

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"
    ]
}
于 2016-06-27T16:57:18.823 回答