MongoDB分组按字段显示分组项目的数组?

时间:2016-10-03 23:17:41

标签: mongodb meteor mongodb-query aggregation-framework mongodb-aggregation

我有一个项目集合,其中项目是这样的:

{
    "_id" : ObjectId("57e3e55c638cb8b971"),
    "allocInvestor" : "Example Investor",
    "fieldFoo" : "foo bar",
    "name" : "GTP 3 (Roof Lease)"
}

我希望收到按allocInvestor字段分组的项目列表,仅显示字段:nameid

如果我像这样使用聚合和$ group:

db.getCollection('projects').aggregate([
    {"$group" : {
                    _id:"$allocInvestor", count:{$sum:1}
                }
    }
])

我收到每个allocInvestor的项目数,但我需要的是每个allocInvestor接收带有子项目的allocInvestor列表。

我在途中使用流星以防万一。但我首先想在mongodb上获得正确的查询然后尝试流星。

2 个答案:

答案 0 :(得分:1)

使用$$ ROOT运算符引用整个文档,然后使用project删除不需要的字段。

db.projects.aggregate([
    {"$group" : {
                    "_id":"$allocInvestor", 
                    "projects" : {"$addToSet" : "$$ROOT"}
                }
    },
    {"$project" : {
                     "_id":0,
                     "allocInvestor":"$_id",
                     "projects._id":1
                     "projects.name":1
                  }
    }
])

答案 1 :(得分:0)

您可以使用$ push或$ addToSet为每个组创建名称和_id列表。 $ push允许重复,$ addToSet不再向列表中添加元素(如果已经存在)。

db.getCollection('projects').aggregate([
                                            { "$group" : { _id : "$allocInvestor", 
                                                           count : {$sum : 1},
                                                           "idList" : {"$addToSet" : "$_id"}, 
                                                           "nameList" : {"$addToSet":"$name"}
                                                       }     
                                            } 
                                    ]);

要在单个列表中获取名称和_id数据:

db.getCollection('projects').aggregate([ 
                                            { "$group" : { _id : "$allocInvestor", "projects" : {"$addToSet" : {id : "$_id", name: "$name"}}}}, 
                                            {"$project" : {"_id" : 0, allocInvestor : "$_id", "projects" : 1 }}
                                        ]);