2013-08-28 6 views
21

ich eine Reihe von Aktualisierungen der Form durchführen

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

gelegentlich ich sehe, wenn dies für den gleichen uuid, genannt versionNumber, & someId mit einem anderen someMessage das erste Update erfolgreich sein wird, aber der zweite fehl schweigend.

Ich sehe die folgenden in den Mongo-Protokolle, so weiß ich die Updates in die Datenbank vornehmen, Hinweis, dass das erste Update die gleiche Abfrage wie die dritte hat aber das erste hat nupdated: 1 während der dritte nupdated: 0

hat
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 

auch hier ist die Ausgabe von 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

Gibt es einen Index auf dem Feld UUID? –

+0

@AsyaKamsky gibt es nicht. Würde das einen Unterschied machen und warum? –

+2

Ich denke, es würde - bemerken, dass das Update, das "dort" zuerst wuchs das Dokument, das verursacht es auf der Festplatte verschoben wurde "nmoved: 1" was bedeutet, dass je nachdem, wie das andere Update die Sammlung gescannt wurde, ist es möglich, "verpasst "Das Dokument (beide Prozesse liefern regelmäßig, was bedeutet, dass sich der Zustand der Welt ändern könnte: numYields: 20) Der Index würde auch bei der Langsamkeit des Updates helfen - Sie scannen über 2500 Dokumente, um 1 zu finden, mit index den nscanned wird viel niedriger sein und beide Updates werden garantiert den Index in der gleichen Reihenfolge "durchlaufen". –

Antwort

2

Als Abhilfe für diesen Fehler, empfehle ich findAndModify und die Ergebnisse überprüft, um sicherzustellen, Ihr Update passiert ist.

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 
    }  
    }); 
Verwandte Themen