【发布时间】:2016-08-02 12:28:36
【问题描述】:
我有一个应用程序可以不断地将文档插入到 MongoDB 集合中。
我正在寻找一种按照插入顺序查询文档的方法。
我想使用的候选人:
-
_id字段 - 创建日期字段
- 序列号(自动递增)
正如文档所说,_id 字段不是一个好的候选者。创建日期字段可能是一个很好的候选者,但是时钟可能不同步的事实可能会破坏顺序。关于序列号,文档提出了两种方法:计数器和乐观循环。计数器方法不能保证插入顺序,因为即使D1.seq < D2.seq 也可能在另一个文档D2 之后插入文档D1。例如,如果D1 占用序列号 5,则 D2 占用序列号 6,然后插入 D2,然后插入 D1。在繁重的插入环境中,乐观循环方法很疯狂。
还有其他方法吗?
编辑:
使用计数器的方法是有问题的。考虑以下场景。我有一个应用程序A,它不断地将文档插入到集合中。我还有另一个应用程序B,它不断地从同一个集合中轮询文档。应用程序A 是多线程的。两个线程T1 和T2 即将分别插入文档D1 和D2。在插入过程中,应用程序B 要求提供更多文档。假设以下操作顺序:
- 线程
A-T1获取下一个序列号N - 线程
A-T2获取下一个序列号N+1 - 线程
A-T2插入D2 - 应用程序
B请求带有seq >= N的文档(假设最后处理的文档有seq 编号N-1)并接收D2(D1尚未插入) - 线程
A-T1插入D1 - 应用程序
B请求带有seq >= N+2的文档(因为最后处理的文档的序列号为N+1)
在这种情况下,D1 将永远不会被处理。
【问题讨论】:
-
如果我理解正确,您需要一种方法来了解文档的创建顺序和保存顺序。我建议您自己生成_id。例如,当服务器启动时,您会插入最后一个_id(或最大的。如1505)。然后你只需在每个文件上增加一个 istert 计数器。你很高兴。即使某些文档无法保存,您也可以将其保存到某个 JSON 文件中并稍后重新保存。 _id 将在那时生成,您将拥有订单系统。希望这会有所帮助。
-
我看不出您的方法与问题中的第三种方法有何不同。
-
是的,只是更多的单词。
-
@MickaelMarrache 我也有同样的问题,你为此选择了什么解决方案?
标签: mongodb