我正在尝试汇总以下数据:
{
"_id" : ObjectId("527a6b7c24a8874c078b9d10"),
"Name" : "FirstName",
"Link" : "www.mylink.com/123",
"year" : 2013
}
{
"_id" : ObjectId("527a6b7c24a8874c078b9d11"),
"Name" : "FirstName",
"Link" : "www.mylink.com/124",
"year" : 2013
}
{
"_id" : ObjectId("527a6b7c24a8874c078b9d12"),
"Name" : "SecondName",
"Link" : "www.mylink.com/125",
"year" : 2013
}
我想汇总Name
字段的出现次数,但也想要在聚合查询的输出中返回相应的Link
字段。现在我这样做(不返回输出中的Link
字段):
db.coll.aggregate([
{ "$match": { "Year": 2013 } },
{ "$group": {
"_id": {
"Name": "$Name"
},
"count": { "$sum": 1 }
}},
{ "$project": {
"_id": "$_id",
"count": 1
}},
{ $sort: {
count: 1
} }
])
以上只返回 Name
字段和计数。但是我怎样才能在聚合查询的输出中返回相应的Link
字段(可能是几个)?
最好的问候
答案 0 :(得分:7)
db.coll.aggregate([
{ "$match": { "year": 2013 } },
{ "$group": {"_id": "$Name", "Link": {$push: "$Link"}, "count": { "$sum": 1 }}},
{ "$project": {"Name": "$_id", _id: 0, "Link": 1, "count": 1}},
{ $sort: {count: 1} }
])
结果:
{ "Link" : [ "www.mylink.com/125" ], "count" : 1, "Name" : "SecondName" }
{ "Link" : [ "www.mylink.com/123", "www.mylink.com/124" ], "count" : 2, "Name" : "FirstName" }
好的,所以$ match是正确的,除了'Year'的拼写错误 - > '年'
$ group可以简化一点。我删除了一组额外的括号,以便您获得id:'FirstName'而不是id:{'name':'FirstName'},因为我们可以在$ project阶段将_id重塑为'name'。
您需要添加$ push或$ addToSet来维护分组中的$ Link值。 $ addToSet仅允许数组中的唯一值,而$ push将添加所有值,因此请根据您的意愿使用。
$ project和$ sort很简单,重命名并包含/排除您想要的任何字段。