MongoDB-查询集合以返回所有具有最新版本的文档

时间:2019-02-26 18:58:54

标签: mongodb mongodb-query aggregation-framework

我对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和最新版本的文档的所有字段?

感谢您的帮助。

谢谢。

1 个答案:

答案 0 :(得分:3)

$$ROOT$last累加器一起使用以获取所有根文档字段

db.collection.aggregate([
  { "$sort": { "docID": 1, "version": 1 }},
  { "$group": {
    "_id": "$docID",
    "last": { "$last": "$$ROOT" }
  }},
  { "$replaceRoot": { "newRoot": "$last" }}
])