MongoDB:从集合中获取按某个字段的最大值过滤的所有文档

时间:2020-06-25 20:04:31

标签: mongodb mongodb-query

我想知道按某个字段的最大值过滤Mongo Collection的最佳方法。如果要在SQL中执行相同的操作,则将应用以下查询。

select * from tableName where column1 in (select max(column1) from tableName)

给出以下示例输入和输出学生。在此,输入数据集将使用StudentAge的最大值进行过滤。

输入

_id StudentName StudentAge
1   John         15
2   David        16
3   Miller       15
4   Mike         16
5   Graham       16

输出

_id StudentName StudentAge
2   David        16
4   Mike         16
5   Graham       16

我尝试查找有关SO的各种问题,但无法找到与我的问题相匹配的任何内容。我正在使用Mongo Compass来查询Mongo集合。

1 个答案:

答案 0 :(得分:1)

尽管有一些解决方法,但在MongoDB中没有做到这一点的直接方法。

方法-1:

实现此目标的一种方法是使用MongoDB聚合查询:

db.<Collection-Name>.aggregate([
    {
        "$group": {
            "_id": "$<Key-Name>",
            "documents": {"$push": "$$ROOT"}
        }
    },
    {
        "$sort": {
            "_id": -1
        }
    },
    {
        "$limit": 1
    },
    {
        "$unwind": "$documents"
    },
    {
        "$replaceRoot": { newRoot: "$documents" }
    },
])

用适当的值修改<Collection-Name><Key-Name>

不建议使用此方法,特别是如果MongoDB集合中包含大量记录的话。

方法-2:

第二种方法是使用传统的MongoDB find方法(尽管它涉及两个find命令。

var recordWithMaxValue = db.<Collection-Name>.find({}, {"<Key-Name>": 1}).sort({"<Key-Name>": -1}).limit(1);  // Init Cursor
db.<Collection-Name>.find({"<Key-Name>": recordWithMaxValue.next()["<Key-Name>"]});  // Get records with Max. value

与第一种方法相比,更推荐使用此方法。

请指出是否有更好的解决方案