2013-08-28 33 views
21

Ben ilk güncelleme başarılı olacaktırMongoDB'm neden eşzamanlı push güncellemeleri başarısız oluyor?

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

bazen bu farklı someMessage ile aynı uuid, versionNumber, & someId için çağrıldığında bkz formun bir dizi güncellemeyi sahnede oluyorum ama ikinci başarısız olur sessizce. Ben güncellemeler veritabanına yapıyoruz bilmeleri

Ben Mongo günlüklerinde şu gördüğünüz ilk güncelleme üçüncü aynı sorguyu vardır ancak üçüncü nupdated: 0

sahipken ilk nupdated: 1 sahip olduğunu haber
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 

Ayrıca burada findAndModify kullanılması önerilir ve güncelleme oldu emin olmak için sonuçları kontrol bu hata için geçici bir çözüm olarak 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 alanında bir dizin var mı? –

+0

@AsyaKamsky yok. Bu bir fark yaratır mı ve neden? –

+2

Sanırım - "oraya" var olan güncellemenin önce "nmoved: 1" diskinde taşınmasına neden olan belgeyi ürettiğini fark ettim, bu da diğer güncellemenin koleksiyona nasıl göz attığına bağlı olarak mümkün olduğunu gösteriyor " "belge (her iki süreç periyodik olarak gerçekleşir, yani dünyanın durumu değişebilir: numYields: 20) Dizin aynı zamanda güncellemenin yavaşlığıyla da yardımcı olur - 1'inci sayfayı bulmak için 2500'ün üzerinde dokümanı tararsınız. çok daha düşük olacak ve her iki güncellemenin de endekse aynı sırayla "kaydırılması" sağlanacaktır. –

cevap

2

çıkışı olmaz.

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 
    }  
    }); 
İlgili konular