我知道MongoDB在插入/更新/删除文档时默认使用异步写入。我的问题是,这些更新是否仍按顺序执行。
我们假设以下upsert-queries后跟delete-query:
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-instance。没有副本集,没有分片: - )答案 0 :(得分:3)
通过单一连接发送的命令被序列化。因此,如果您通过一个连接发送这些内容,则可确保在两次插入后发生remove
。
异步写入(AKA“fire and forget”)意味着客户端库不等待写入的确认。它只是将插入物插入插座并忘记它。如果,在应用此插入时,存在唯一的索引违规(例如),您将永远不会知道。
顺便提一下,您可以使用mongodb的最新功能:TTL indexes! MongoDB将自行删除陈旧数据,您只需继续插入:)