【问题标题】:Single query for fetching latest documents in MongoDB用于在 MongoDB 中获取最新文档的单个查询
【发布时间】:2014-07-27 06:20:06
【问题描述】:

需要一个查询来获取最新文档 - MongoDB

我有一个这样的 MongoDB 集合,

db.file_info.find()

{ "_id" : A, "fileID" : 0, "size" : 126, "version" : 1}

{ "_id" : B, "fileID" : 1, "size" : 126, "version" : 1}

{ "_id" : C, "fileID" : 2, "size" : 121, "version" : 1}

{ "_id" : D, "fileID" : 1, "size" : 124, "version" : 2}

{ "_id" : E, "fileID" : 3, "size" : 125, "version" : 2}

{ "_id" : F, "fileID" : 2, "size" : 120, "version" : 3}

{ "_id" : G, "fileID" : 4, "size" : 122, "version" : 3}

我要查询fileID的最新版本,按版本排序。

我需要这样的结果,

{ "_id" : G, "fileID" : 4, "size" : 122, "version" : 3}

{ "_id" : E, "fileID" : 3, "size" : 125, "version" : 2}

{ "_id" : F, "fileID" : 2, "size" : 120, "version" : 3}

{ "_id" : D, "fileID" : 1, "size" : 124, "version" : 2}

{ "_id" : A, "fileID" : 0, "size" : 126, "version" : 1}

我找不到给出上述结果的查询。目前我们正在通过这种方式克服这个问题:

db.file_info.find({"version":{$lte:3}}).sort({"version":1});

它将按顺序列出所有低于版本3的文档。然后我们正在处理内存中的结果集并获取最新版本。 但这对于更大的集合是不可扩展的。如果我们可以将其作为单个查询执行,那对我的项目会更好。

【问题讨论】:

    标签: mongodb


    【解决方案1】:
    db.file_info.aggregate({$group: {_id : '$_id', fileID: '$fileID', size: '$size', version: {$max: '$version'}}})
    

    【讨论】:

    • 感谢您的回复。
    【解决方案2】:

    您可以使用aggregate,而不是find

    db.file_info.aggregate([
        // Descending sort of all docs on version
        {$sort: {version: -1}},
        // Group the docs by fileID, taking the fields from the first doc in each
        // group. Because of the previous sort, this gets the fields from the doc
        // with the highest version.
        {$group: {
            _id: '$fileID', 
            origid: {$first: '$_id'}, 
            size: {$first: '$size'}, 
            version: {$first: '$version'}
        }},
        // Reshape the docs to restore the original structure.
        {$project: {
            _id: '$origid', 
            fileID: '$_id', 
            size: '$size', 
            version: '$version'
        }}
    ])
    

    输出

    {
        "result" : [ 
            {
                "_id" : "A",
                "size" : 126,
                "version" : 1,
                "fileID" : 0
            }, 
            {
                "_id" : "E",
                "size" : 125,
                "version" : 2,
                "fileID" : 3
            }, 
            {
                "_id" : "D",
                "size" : 124,
                "version" : 2,
                "fileID" : 1
            }, 
            {
                "_id" : "G",
                "size" : 122,
                "version" : 3,
                "fileID" : 4
            }, 
            {
                "_id" : "F",
                "size" : 120,
                "version" : 3,
                "fileID" : 2
            }
        ],
        "ok" : 1
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-06
      • 1970-01-01
      • 1970-01-01
      • 2017-01-19
      • 2018-11-26
      • 2016-05-25
      • 2018-09-04
      相关资源
      最近更新 更多