2012-09-07 77 views
1

我知道,当插入/更新/删除文档时,MongoDB默认使用异步写入。我的问题是如果这些更新仍然按顺序执行。MongoDB-upsert:火和忘记

假设以下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”值已更新。

我认为“async-write-thing”只与数据从RAM写入光盘的时间有关。我认为它不会影响命令的顺序,所以上面的例子总是能工作(如果更新成功),对吗?

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

回答

3

通过单个连接发送的命令被序列化。因此,如果您确实通过一个连接发送了这些内容,则确保remove将在两次插入后发生。

异步写入(又名“忘了忘记”)意味着客户端库不会等待写入确认。它只是将插入物插入插座并忘记它。如果在应用此插入时存在唯一的索引违例(例如),则永远不会知道。

顺便说一句,你可以使用mongodb的最新功能:TTL indexes! MongoDB将自行删除陈旧的数据,您只需继续插入:)