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