Mongodb 获取第一个聚合结果,并在附加元素中聚合所有其他结果

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:

我需要从一个查询中获取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: "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版本引起的,但现在正在工作。。。我很感激如果你能调整或者在你的答案中加上注释,也许会对其他人有用。。。再次感谢!