Mongodb 获取第一个聚合结果,并在附加元素中聚合所有其他结果
我需要从一个查询中获取N个最上面的项,并将所有其他项(不在N个最上面)分组到一个附加元素中 例如,考虑包含以下文档的集合:Mongodb 获取第一个聚合结果,并在附加元素中聚合所有其他结果,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我需要从一个查询中获取N个最上面的项,并将所有其他项(不在N个最上面)分组到一个附加元素中 例如,考虑包含以下文档的集合: {user: "Ana", post: "A" }, {user: "Ana", post: "B" }, {user: "Ana", post: "C" }, {user: "Ana", post: "D" }, {user: "Bruce", post: "E" }, {user: "Bruce", post: "F" }, {user: "Bruce", post:
{user: "Ana", post: "A" },
{user: "Ana", post: "B" },
{user: "Ana", post: "C" },
{user: "Ana", post: "D" },
{user: "Bruce", post: "E" },
{user: "Bruce", post: "F" },
{user: "Bruce", post: "G" },
{user: "Cami", post: "H" },
{user: "Cami", post: "I" },
{user: "John", post: "J" },
{user: "Peter", post: "K" },
{user: "Helena", post: "L" }
我希望得到贡献最大的两个用户,并将所有其他用户聚合到一个额外的输出项中。例如:
{user: "Ana", count: 4},
{user: "Bruce", count: 3},
{user: "All others guys", count: 5}
现在我正在使用“聚合”函数:
db.MyTest.aggregate(
[
{
$group: {
"_id": "$user",
count: {
$sum: 1
}
}
},
{
$sort: {
count: -1,
userName: 1
}
}
]
);
我不知道如何对待“所有其他人”这个项目。我的函数返回以下结果:
{_id: "Ana", count: 4},
{_id: "Bruce", count: 3},
{_id: "Cami", count: 2},
{_id: "John", count: 1},
{_id: "Peter", count: 1},
{_id: "Helena", count: 1}
你知道如何通过一个查询直接在mongo中实现这一点吗
备注:我正在使用Mongo 3.2.11。在对统计数据进行排序后,您可以将所有用户的统计数据推送到数组中,然后按索引从该数组中获取所需的项目,并对所有其他项目进行切片,以便稍后聚合其统计数据:
db.users.aggregate([
{$group: {_id:"$user", count:{$sum:1}}},
{$sort: {count:-1}},
// Split stats into first, second and others
{$group: {_id:1, users:{$push:{user:"$_id", count:"$count"}}}},
{$project: {
first : {$arrayElemAt: ["$users", 0]},
second: {$arrayElemAt: ["$users", 1]},
others: {$slice:["$users", 2, {$size: "$users"}]}
}
},
// Calculate count for all other guys
{$project: {
stats: [
"$first",
"$second",
{
user: "All other guys",
count: {$sum: "$others.count"}
}
]
}
},
// Bring embeded documents to top level
{$unwind: "$stats"},
{$project: { _id:0, user: "$stats.user", count: "$stats.count" }}
])
输出:
{
"user" : "Ana",
"count" : 4
},
{
"user" : "Bruce",
"count" : 3
},
{
"user" : "All other guys",
"count" : 5
}
注意:即使数据库中没有用户或只有一个用户,代码也可以工作。但在第二种情况下,您将获得第二大可邮寄用户的统计数据的空文档。这很公平。您的MongoDB服务器版本是什么?另外,你能更新你的问题来展示你到目前为止做了些什么吗?嘿,克里丹,我用你的建议更新了这个问题。谢谢嘿,谢尔盖,谢谢,伙计,工作起来很有魅力。。。我在这里做了一个调整:替换这一行:user:“All other guys”,对于这一行:user:{$ifNull:[null,“All other guys”]},我不知道错误(…“FieldPath‘All other guys’不以$”开头)是否是由不同的mongodb版本引起的,但现在正在工作。。。我很感激如果你能调整或者在你的答案中加上注释,也许会对其他人有用。。。再次感谢!