Mongodb为每个组找到具有最大特定字段值的文档(argmax)

时间:2016-08-12 08:06:04

标签: mongodb mongodb-query aggregation-framework

在我的aggreagate管道中执行展开后,我有中间结果,例如:

[
{_id:1, precision:0.91, recall:0.71, other fields...},
{_id:1, precision:0.71, recall:0.81, other fields...},
{_id:1, precision:0.61, recall:0.91, other fields...},
{_id:2, precision:0.82, recall:0.42, other fields...},
{_id:2, precision:0.72, recall:0.52, other fields...},
{_id:2, precision:0.62, recall:0.62, other fields...}
]

现在我想通过_id对文档进行分组,然后在每个组中查找最大召回的文档,并获取此文档的召回,精度和_id。

结果将是:

[
    {_id:1, precisionOfDocWithMaxRecall:0.61, maxRecall:0.91},
    {_id:2, precisionOfDocWithMaxRecall:0.62, maxRecall:0.62}
]

我已设法使用group和max但没有精确字段来获取结果。

1 个答案:

答案 0 :(得分:5)

您可以运行以下管道,它使用 $sort 运算符来排序文档首先进入 $group 管道,然后使用 $first (或 $last ,具体取决于排序方向),以返回有序列表中的第一个/最后一个元素:

db.collection.aggregate([
    /* previous pipeline */
    { "$sort": { "recall": -1 } },
    { 
        "$group": {
            "_id": "$_id",
            "precisionOfDocWithMaxRecall": { "$first": "$precision" },
            "maxRecall": { "$first": "$recall" }
        }
    }
])