【问题标题】:MongoDB - query collection to return all docs with latest versionMongoDB - 查询集合以返回所有最新版本的文档
【发布时间】:2019-02-26 18:58:53
【问题描述】:

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

感谢任何帮助。

提前致谢。

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework


    【解决方案1】:

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

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

    【讨论】:

    • 作为后续问题,如果流水线中馈送到$group阶段的数据量超过100MB,会触发内存超出错误,是否有替代方案? AllowDiskUse 选项太慢,无法使用。
    猜你喜欢
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多