查找在汇总步骤中找到的共享最大值(值)的所有文档

时间:2016-05-01 23:28:31

标签: mongodb mongodb-query aggregation-framework

我正在尝试查找分享 max(num_sold)的所有文档。我不能按降序排序并进行限制(1)因为我会错过其他文档也具有相同max(num_sold)的情况。鉴于这个过度简化的数据集:

{"item":"Apple", "num_sold": 49}
{"item":"Orange", "num_sold": 55}
{"item":"Peach", "num_sold": 55}
{"item":"Grape", "num_sold": 20}
{"item":"Banana", "num_sold": 20}

我想回来

{"item":"Orange", "num_sold": 55}
{"item":"Peach", "num_sold": 55}    

使用SQL,这是一个简单的查询,然后连接回主数据集。我对MongoDB中如何做到这一点感到有点难过。

我找到了最大值,但是如何获得具有最大值的所有文档?

db.t.aggregate(
    {$group:{
          _id:null,
          num_sold:{$max:"$num_sold"}
          }
    }
);
{ "_id" : null, "num_sold" : 55 }

1 个答案:

答案 0 :(得分:3)

您可以通过对num_sold进行分组,然后使用$sort$limit管道阶段来获取具有最大值的文档来执行此操作:

db.t.aggregate([
    // Group by num_sold, assembling an array of docs with each distinct value.
    {$group: {
        _id: '$num_sold',
        docs: {$push: '$$ROOT'}
    }},
    // Sort the groups by _id descending to put the max num_sold group first.
    {$sort: {_id: -1}},
    // Return just the first (max num_sold) group of docs.
    {$limit: 1}
])

输出:

{ 
    "_id" : 55.0, 
    "docs" : [
        {
            "_id" : ObjectId("5726a62879ce3350ff8d607e"), 
            "item" : "Orange", 
            "num_sold" : 55.0
        }, 
        {
            "_id" : ObjectId("5726a62879ce3350ff8d607f"), 
            "item" : "Peach", 
            "num_sold" : 55.0
        }
    ]
}