【发布时间】:2017-03-17 09:42:19
【问题描述】:
我们在 Mongodb 中对大部分集合进行版本控制。选择的版本控制机制如下:
{ "docId" : 174, "v" : 1, "attr1": 165 } /*version 1 */
{ "docId" : 174, "v" : 2, "attr1": 165, "attr2": "A-1" }
{ "docId" : 174, "v" : 3, "attr1": 184, "attr2" : "A-1" }
因此,当我们执行查询时,我们总是需要以这种方式使用聚合框架来确保获取对象的最新版本:
db.docs.aggregate( [
{"$sort":{"docId":-1,"v":-1}},
{"$group":{"_id":"$docId","doc":{"$first":"$$ROOT"}}}
{"$match":{<query>}}
] );
这种方法的问题是,一旦您完成了分组,您的内存中有一组与您的集合无关的数据,因此您的索引无法使用。
因此,您的集合中的文档越多,查询就越慢。
有什么办法可以加快速度吗?
如果没有,我会考虑转向这篇好帖子中定义的方法之一:http://www.askasya.com/post/trackversions/
【问题讨论】:
-
为什么第一阶段没有$match?
-
为文档的 docId 字段添加索引。
-
@DanieleTassone 恐怕这不是一个选择。解释在我提供的链接中。基本上,如果您在开始时进行过滤,您最终会得到不是最新的版本,但排序组阶段会将它们视为最新版本。执行这样的版本控制时,这是一个常见错误。
-
@Parshuram 为 docId 添加索引会加快组操作,但不会加快后面的 $match,不是吗?
-
@jbernal 我看到了带有详细信息的链接。链接 (db.docs.find({"docId":174}).sort({"v":-1}).limit(-1);) 中解释了最有效的方法想。如果您需要 1 个文档,这可以正常工作。如果您同时需要更多文件是另一回事:这是我不明白的事情,您能更好地解释一下吗?有不同的解决方案,但我应该更好地理解。另外 - 我们可以考虑 MongoDB 3.4 吗?
标签: mongodb aggregation-framework document-versioning