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

时间:2020-08-25 16:01:04

标签: javascript node.js mongodb aggregation-framework 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" },
            }
        }
    ])

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

谢谢您的任何建议。

1 个答案:

答案 0 :(得分:1)

解决方案:

$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" },
        }
    }
])