用于在MongoDB中获取最新文档的单个查询

时间:2014-07-26 12:48:18

标签: mongodb

需要一个查询来获取最新文档 - 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.然后我们在内存中处理结果集并获取最新版本。  但对于较大的集合,这不可扩展。如果我们可以将它作为单个查询执行,那么对我的项目来说会更好。

2 个答案:

答案 0 :(得分:0)

db.file_info.aggregate({$group: {_id : '$_id', fileID: '$fileID', size: '$size', version: {$max: '$version'}}})

答案 1 :(得分:0)

您可以使用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
}