2012-09-07 81 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將自行刪除陳舊的數據,您只需繼續插入:)