我对Mongo相当陌生,我有以下任务:
运行Mongo 3.4.2。
收藏:
[
{
"docID": "aaa111",
"version": 1,
"somefield1": "abc"
},
{
"docID": "aaa111",
"version": 2,
"somefield1": "abc",
"somefield2": "abc"
},
{
"docID": "bbb222",
"version": 1,
"somefield1": "abc",
"somefield2": "abc"
},
{
"docID": "bbb222",
"version": 2,
"somefield1": "abc",
"somefield3": "abc"
},
{
"docID": "bbb222",
"version": 3,
"somefield2": "abc",
"somefield3": "abc"
}
]
换句话说,具有相同docID的文档可以具有不同的“模式”。
我需要查询该集合以返回具有最新版本的文档,以及这些特定文档的所有字段。
这是基于上述集合的查询输出应为:
[
{
"docID": "aaa111",
"version": 2,
"somefield1": "abc",
"somefield2": "abc"
},
{
"docID": "bbb222",
"version": 3,
"somefield2": "abc",
"somefield3": "abc"
}
]
我一直在尝试使用$ aggregate运算符,如下所示:
db.collection.aggregate(
[
{ $sort: { docID: 1, version: 1 } },
{ $group:
{
_id: "$docID",
latestVersion: { $last: "$version" }
}
}
]
)
,但这仅返回2个字段,docID和最新版本。
然后我尝试使用$ in运算符使用find()从该集合中进行选择,其中$ in会接受上述查询,但是,一个问题是$ in需要和数组,其次,我需要选择docID和版本与子查询结果匹配的文档。
如何获取具有docID和最新版本的文档的所有字段?
感谢您的帮助。
谢谢。
答案 0 :(得分:3)
将$$ROOT
与$last
累加器一起使用以获取所有根文档字段
db.collection.aggregate([
{ "$sort": { "docID": 1, "version": 1 }},
{ "$group": {
"_id": "$docID",
"last": { "$last": "$$ROOT" }
}},
{ "$replaceRoot": { "newRoot": "$last" }}
])