我有一个应用程序不断地将文档插入到MongoDB集合中。MongoDB - 反映插入顺序的字段
我正在寻找一种方法来查询其插入顺序后的文档。
候选人我想用:
- 的
_id
场 - 创建日期域
- 序列号(自动递增)
的_id
领域是不是一个好候选人作为文档说。创建日期字段可能是一个很好的候选字段,但时钟可能不同步的事实可能会破坏订单。关于序列号,文件提出了两种方法:计数器和乐观循环。由于文档D1
可能会插入另一个文档D2
,即使D1.seq < D2.seq
,计数器方法也不能保证插入顺序。例如,如果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)。然后你只需在每个文件上增加计数器。你很好走。即使某些文档无法保存,您可以将其保存到某个JSON文件并稍后重新保存。当时会生成_id,您将拥有订单系统。希望这可以帮助。 –
我不明白你的方法与问题中的第三种方法不同。 –
是的,这里只有更多的单词。 –