1

我知道 MongoDB 在插入/更新/删除文档时默认使用异步写入。我的问题是这些更新是否仍按顺序执行。

让我们假设以下 upsert 查询后跟一个删除查询:

db.servers.update({ "server": "abcdef" }, { "$set": { "lastSeen": new Date()}}, /*upsert=*/ true);
db.servers.update({ "server": "uvwxyz" }, { "$set": { "lastSeen": new Date()}}, /*upsert=*/ true);
db.servers.remove({ "lastSeen": { "$lt": new Date(Date.now() - 3600000) }  });

如果这些命令按这些顺序执行,那么保证(如果操作成功)首先插入/更新两个文档,然后删除操作将删除过时的文档?我希望插入/删除的文档都不会被删除,因为它们的“lastSeen”值已更新。

我认为“异步写入”只与数据从 RAM 写入磁盘的时间有关。我认为它不会影响命令的顺序,因此上面的示例将始终有效(如果更新成功),对吧?

编辑:我使用单个 mongod 实例。没有副本集,没有分片:-)

4

1 回答 1

3

通过单个连接发送的命令被序列化。因此,如果您确实通过一个连接发送它们,则可以保证这remove将在两次插入之后发生。

异步写入(AKA “即发即弃”)意味着客户端库不等待写入确认。它只是将插件吐入插座并忘记它。如果在应用此插入时存在唯一索引违规(例如),您将永远不会知道。

顺便说一下,你可以使用 mongodb 的最新特性:TTL 索引!MongoDB 会自行删除陈旧的数据,您只需继续插入 :)

于 2012-09-07T12:49:25.297 回答