0

快速提问。

我有许多更新命令要在我的 MongoDB 数据库上运行。这些发生在用户完成许多任务并希望将所有更新推送到服务器之后。我将更新几个集合中的几个文档。

如果我想确保这些更新是原子的,并且来自其他用户的其他同时查询或命令不会干扰,我可以将我的查询分开;吗?

简化示例:

db.cities.find({"asciiname":"Zamin Sukhteh"});db.cities.find({"asciiname":"Konab-e Vasat"})

以上会导致两个单独的原子查询吗?

4

1 回答 1

1

虽然您不能使用分隔符来分隔 shell 中的命令以引入原子性,但您可以使用 db.eval。

如果您只使用 shell(您在评论中说过),则可以使用db.eval函数在执行一段 JavaScript 代码时执行数据库范围的锁定。这不是您通常想要做的事情(因为它默认阻止所有写入和读取),但在您在上面描述的情况下(再次,评论),听起来它符合您的需求。

db.eval( function() {
    var one = db.cities.find({"asciiname":"Zamin Sukhteh"});
    var two = db.cities.find({"asciiname":"Konab-e Vasat"});
    // other work ...
});

更新(解决评论):

如果您想在 MongoDB 中进行高效的原子(类似)更新,有几个选项:

  1. 将所有内容放在一个文档中。这在 MongoDB 中保证是原子的。但是,这通常不适用于复杂的文档模型(或大型文档)。
  2. 如果文档存在依赖关系,请考虑放置依赖文档的新“版本”,然后,只有在这些都设置好之后,才将链接这些文档的最终文档放入数据库中。如果没有最终的“链接”,旧文档不应该看到新版本。根据数据的使用方式,您可能会非常快速地删除旧版本(如果需要,也可以定期删除)。
  3. 接受偶尔会出现不匹配并检测它们(然后重新运行查询以获取新数据)。当您遍历文档结构时,您也许可以使用时间戳或版本来识别这些情况。
  4. 将数据缓存在其他地方作为常见查询的完整结构
  5. 确定 MongoDB 不适合您的要求。
于 2013-02-03T19:35:33.997 回答