快速问题。
我有许多更新命令要在我的MongoDB数据库上运行。这些情况发生在用户完成了许多任务并希望将所有更新推送到服务器之后。我将更新几个集合中的几个文档。
如果我想确保这些更新是原子的,并且其他用户的其他同时查询或命令不会干扰,我可以用;
分离我的查询吗?
简化示例:
db.cities.find({"asciiname":"Zamin Sukhteh"});db.cities.find({"asciiname":"Konab-e Vasat"})
以上结果会导致两个单独的原子查询吗?
虽然不能在shell中使用分隔符来分隔命令以引入原子性,但可以使用db.eval.
如果你只使用shell(你在评论中说过),你可以在执行一块JavaScript代码时使用db.eval函数来执行数据库范围的锁定。这不是你通常想做的事情(因为默认情况下它会阻止所有的写入和读取),但在你上面描述的情况下(同样是评论),听起来它符合你的需求。
db.eval( function() {
var one = db.cities.find({"asciiname":"Zamin Sukhteh"});
var two = db.cities.find({"asciiname":"Konab-e Vasat"});
// other work ...
});
更新(针对评论):
如果你想在MongoDB中进行高效的原子(类)更新,有几个选项:
- 将所有内容放在一个文档中。这在MongoDB中是原子的。然而,这通常不适用于复杂的文档模型(或大型文档)
- 如果文档上存在依赖项,请考虑放置依赖文档的新"版本",然后,只有在这些文档都设置好之后,才将链接这些文档的最终文档放入数据库。如果没有最后的"链接",旧文档就不应该看到新版本。根据数据的使用方式,您可能会很快(或根据需要定期)删除旧版本
- 接受偶尔会出现不匹配的情况并检测它们(然后重新运行查询以获取新数据)。在遍历文档结构时,您可以使用时间戳或版本来识别这些案例
- 将数据作为通用查询的完整结构缓存到其他位置
- 确定MongoDB不太适合您的需求