2013-08-28 28 views
21

我進行了一些形式爲什麼我的MongoDB同時推送更新失敗?

update(
    { "uuid": someUuid, "revision.versionNumber": someVersionNumber}, 
    { "$set": { "meta.someId": someId }, "$push": { "meta.someMessages": someMessage } } 
) 

偶爾我看的時候這就是所謂的同uuidversionNumber,& someId用不同someMessage的更新的第一次更新將會成功,但第二個將失敗默默。

我看到蒙戈日誌下面,所以我知道該更新能夠進入數據庫, 注意,第一個更新具有相同的查詢作爲第三人,但第一個具有nupdated: 1而第三個具有nupdated: 0

Wed Aug 28 14:50:24 [conn18] update some-db.some_collection query: { uuid: "b841f303-a054-4eb9-8885-9d3ebf9906a1", revision.versionNumber: 9 } update: { $set: { meta.someId: "521e6fe4036420f90371a922" }, $push: { meta.someMessages: { event: "instance.complete", timestamp: new Date(1377726624985) } } } nscanned:2507 nmoved:1 nupdated:1 keyUpdates:0 numYields: 19 locks(micros) w:6010 9ms 
Wed Aug 28 14:50:24 [conn18] run command some-db.$cmd { getlasterror: 1, fsync: true } 
Wed Aug 28 14:50:24 [conn14] update some-db.some_collection query: { uuid: "843f424d-8a62-4a8b-853f-dc2e9c42b309", revision.versionNumber: { $lt: 10 }, meta.deleted: true } update: { $set: { meta.deleted: false } } nscanned:3243 nupdated:0 keyUpdates:0 numYields: 23 locks(micros) w:8431 11ms 
Wed Aug 28 14:50:24 [conn14] run command some-db.$cmd { getlasterror: 1, fsync: true } 
Wed Aug 28 14:50:24 [conn5] update some-db.some_collection query: { uuid: "b841f303-a054-4eb9-8885-9d3ebf9906a1", revision.versionNumber: 9 } update: { $set: { meta.someId: "521e6fe4036420f90371a922" }, $push: { meta.someMessages: { event: "instance.complete.success", timestamp: new Date(1377726624985) } } } nscanned:3242 nupdated:0 keyUpdates:0 numYields: 20 locks(micros) w:5684 9ms 

而且,這裏是從mongosniff

update flags:0 q:{ uuid: "85700d8c-8946-4b09-968b-968f76d31028", revision.versionNumber: 13 } o:{ $set: { meta.someId: "521e7b12036420f90371b515" }, $push: { meta.someMessages: { event: "instance.complete", timestamp: new Date(1377729439093) } } } 
319 some-db.some_collection 

    update flags:0 q:{ uuid: "a460019d-443b-4b59-b23e-1eae19e26c31", revision.versionNumber: 14 } o:{ $set: { meta.someId: "521e7b2f036420f90371b579" }, $push: { meta.someMessages: { event: "task.start", timestamp: new Date(1377729439093) } } } 
123 some-db.some_collection 

    query: { uuid: "a2558f5c-d825-4ec4-bbc4-7e48b1cb3c60", isLatest: true } ntoreturn: -1 ntoskip: 0 
302 some-db.some_collection 

    update flags:0 q:{ uuid: "85700d8c-8946-4b09-968b-968f76d31028", revision.versionNumber: 13 } o:{ $set: { meta.someId: "521e7b12036420f90371b515" }, $push: { meta.someMessages: { event: "instance.complete.success", timestamp: new Date(1377729439093) } } } 
173 some-db.some_collection 
+0

有沒有關於uuid字段的索引? –

+0

@AsyaKamsky沒有。這會有所作爲嗎?爲什麼? –

+2

我認爲它會 - 注意到那裏的「更新」首先增長了導致它在磁盤上移動的文檔「nmoved:1」,這意味着根據另一個更新如何掃描集合有可能「錯過了」 「這個文檔(這兩個過程都會週期性地產生,這意味着世界的狀態可能會改變:numYields:20)索引也會幫助緩慢更新 - 您正在掃描超過2500個文檔以找到1進行更新,索引爲已掃描將會低得多,並且這兩個更新將被保證以相同順序「遍歷」該索引。 –

回答

2

輸出作爲解決辦法針對此錯誤,我建議使用findAndModify和檢查結果,以確保您的更新發生。

dbCollection.findAndModify(
{ "uuid": someUuid, "revision.versionNumber": someVersionNumber}, 
[], { "$set": { "meta.someId": someId }, "$push": { "meta.someMessages": someMessage } }, {safe: true, 'new' : true}, function(err, updated){ 
    if(err){ 
    //handle the error 
    } 
    if(updated.meta.someMessages doesn't contain your message) { 
    //try it again or report it to the client 
    }  
    });