在N个先前的结果上具有$ group和$ limit的聚合管道?

问题描述

我想运行一个查询,该查询仅按日期将最新的N结果(例如10)分组。这意味着要进行滚动采样,每次查询发生时,它都会采样一​​些最后的答案。

这是我认为管道应该工作的方式:

    Answer.aggregate([
        {
            $match: {
                user_team_oid: team_oid
            },},{
            $sort: { 
                create_date: 1 
            }
        },{
            $limit: 10
        },{
            $group: {
                "user_team_oid":    "$team_oid","avg_a":            { $avg: "$var_a" },"avg_b":            { $avg: "$var_b" },"avg_c":            { $avg: "$var_c" },"avg_d":            { $avg: "$var_d" },"avg_e":            { $avg: "$var_e" },}
        }
    ])

但是,结果仍然是“未定义”。

谢谢您的任何建议。

解决方法

解决方案:

$group阶段需要一个"_id"键。在这种情况下,将"_id"误命名为"user_team_oid"是个问题。 (请参见下面的工作代码)

好消息是该模式可以很好地工作,并允许在$group阶段之前进行排序和过滤。

坏消息是该问题应该通过重新访问MongoDB Aggregation documentation来解决(感谢@Taplar的友好提醒)

工作代码:

Answer.aggregate([
    {
        $match: {
            user_team_oid: team_oid
        },},{
        $sort: { 
            create_date: 1 
        }
    },{
        $limit: 10
    },{
        $group: {
            "_id":              "$team_oid","avg_a":            { $avg: "$var_a" },"avg_b":            { $avg: "$var_b" },"avg_c":            { $avg: "$var_c" },"avg_d":            { $avg: "$var_d" },"avg_e":            { $avg: "$var_e" },}
    }
])