我正在尝试汇总以下数据:
{
"_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
字段.现在我正在这样做(not 在输出中返回 Link
字段):
db.coll.aggregate([
{ "$match": { "Year": 2013 } },
{ "$group": {
"_id": {
"Name": "$Name"
},
"count": { "$sum": 1 }
}},
{ "$project": {
"_id": "$_id",
"count": 1
}},
{ $sort: {
count: 1
} }
])
以上返回only Name
字段和计数。但是如何在聚合查询的输出中也返回相应的 Link
字段(可以是多个)?
最好的问候
最佳答案
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' --> 'year' 的拼写错误
$group 可以稍微简化一下。我删除了一组额外的括号,以便您得到 id: 'FirstName' 而不是 id: { 'name': 'FirstName' } 因为我们可以在 $project 阶段将 _id reshape 为 'name'。
您需要添加 $push 或 $addToSet 来维护分组中的 $Link 值。 $addToSet 将仅允许数组中的唯一值,而 $push 将添加所有值,因此请自行决定使用哪个值。
$project 和 $sort 很简单,可以重命名和包含/排除您想要的任何字段。
关于mongodb - 汇总返回特定字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39412691/