我在 mongodb 中有一个分片的文档集合,并且有几个应用程序服务器在访问它。
每个应用程序都会贡献新文档,最终还需要删除一些文档。
删除哪些文档并不重要,但重要的是它删除(声明)一个确切的数字,并且没有其他应用程序正在删除(声明)相同的文档。
我的想法是:
unique = makeUniqueValue()
docs = []
for (i = 0;i < 10;i++) {
r = findAndModify( claim: false, $set: { claim: unique });
if (r.value) docs.push(r);
}
if (docs.length < 10)
"release all docs by updating (claim: false) and try again in some time"
此解决方案的一个潜在问题是,如果应用程序太多(而文档很少),他们只会继续声明一些文档并再次发布它们。
这个问题的众所周知且经过充分测试的解决方案是什么?
“update”和“findAndModify”是否保证更新后的文档与更新前的查询匹配?
或者另一个应用程序是否可以在匹配和更新之间“窃取”它,因此两个应用程序都认为他们已经声明了该文档?