【问题标题】:MongoDB: Get all documents from collection filtered by max value of some fieldMongoDB:从某个字段的最大值过滤的集合中获取所有文档
【发布时间】:2020-06-25 20:04:31
【问题描述】:

我想知道按某些字段的最大值过滤 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 集合。

【问题讨论】:

    标签: mongodb mongodb-query


    【解决方案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" }
        },
    ])
    

    用适当的值修改&lt;Collection-Name&gt;&lt;Key-Name&gt;

    不建议使用此方法,尤其是当 MongoDB 集合中包含大量记录时。

    方法 - 2:

    第二种方法是使用传统的MongoDB查找方法(虽然它涉及两个查找命令。

    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
    

    与第一种方法相比,这种方法更值得推荐。

    如果有更好的解决方案请指出

    【讨论】:

    • 感谢您的回答。我将阅读您使用的标签并理解它。也将等待几天,看看我们是否得到任何其他更好的答案。
    • @hhharsha360。如果可能的话,你能告诉我如何在 Mongo Compass 中做到这一点吗?即使它需要多个阶段,也没关系。
    • 确保您使用的是最新版本的 MongoDB 指南针。打开所需的集合并单击Aggregations 选项卡。单击左中面板的下拉菜单,然后从列表中选择$group。仅在文本框中键入查询,而无需在文本框中输入管道阶段名称,例如,仅应出现引用:{ "_id": "$&lt;Key-Name&gt;", "documents": {"$push": "$$ROOT"} }。完成后,单击底部的Add Stage 按钮以添加其他阶段,如 $sort、$limit 等。添加阶段时,右侧面板上的结果会发生变化
    • 是的,我能够按照 Mongo Compass 中的方法 1 进行操作,并且效果很好。谢谢您,我将您的答案标记为已接受。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-31
    • 2016-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多