2014-12-03 44 views
1

我在forEach函數中執行更新時遇到問題,它只更新第一行。Mongo for each函數只在第一行執行更新

好了,我想作一個查詢,更新我的文檔的某些領域,但我有以下限制:

1)一個字段的更新已經在另一個集合中查找。

2)基於其中一個字段的值,我必須決定是否更新一種或另一種方式。

3)基於其中一個字段的值,我必須刪除一些字段。

我執行的查詢如下:

db.events_migration.find({'$or':[{'event.type':'EXBC'},{'event.type':'ENBC'}],'event.value.major':{'$exists':true}}).forEach(function (doc1) { 
var doc2 = db.regions.findOne({ 'beaconId.major': doc1.event.value.major,'beaconId.minor':doc1.event.value.minor,'group.uuid':doc1.event.value.uuid }); 

    if (doc2 != null) { 

     doc1.event.value.beacon = doc2._id; 
     db.events_migration.save(doc1); 

     if(doc1.event.type=='EXBC'){ 
     db.events_migration.update({'_id':doc1.id}, {$set:{'event.source':'SDK','event.type':'MOB','event.extType':'BCN','event.action':'EXT'}, 
                $unset:{'event.value.major':'','event.value.minor':'','event.value.uuid':''}}); 

     } 
     else{ 
     db.events_migration.update({'_id':doc1.id}, {$set:{'event.source':'SDK','event.type':'MOB','event.extType':'BCN','event.action':'ENT'}, 
                 $unset:{'event.value.major':'','event.value.minor':'','event.value.uuid':''}}); 
     } 
} 
}); 

首屆約束,如果有效地開展工作。它查找在另一個集合寄存器,並把它添加到doc1的:

var doc2 = db.regions.findOne({ 'beaconId.major': doc1.event.value.major,'beaconId.minor':doc1.event.value.minor,'group.uuid':doc1.event.value.uuid }); 
doc1.event.value.beacon = doc2._id; 

的約束2和3中,只對第一個寄存器更新執行更新功能時,其他的是我遇到的問題保持原樣。

db.events_migration.update({'_id':doc1.id}, {$set:{'event.source':'SDK','event.type':'MOB','event.extType':'BCN','event.action':'EXT'}, 
                $unset:{'event.value.major':'','event.value.minor':'','event.value.uuid':''}}); 

我莫名其妙新執行這種蒙戈的操作,所以我將不勝感激爲什麼發生這種情況的解釋。提前致謝!

回答

1

問題在於更新查詢投影。

db.events_migration.update({'_id':doc1.id} ... 

任何文件的編號應與_id現場訪問。在這種情況下,ID返回undefined

更新它,如下所示(通知強調)應該解決的問題:

db.events_migration.update({'_id':doc1._id} ... 
+0

感謝丹尼爾,我得到它的工作,但我有一個問題。我沒有使用多參數,因爲我認爲這是因爲它是一個forEach函數,它會爲每一行調用update方法,這是如何工作的?如果我使用多參數,它會重複每次迭代的更新嗎?謝謝 – Sabaspro 2014-12-03 13:27:06

+0

那麼,我以前的回答是誤導性的,在這種情況下'多重'論證不是問題。請延長我的歉意。我已經更新了它。填寫免費索取更多詳細信息。我擁有你我的第一個答案;) – 2014-12-03 15:25:16

+0

感謝丹尼爾!,現在它工作就像一個魅力。正如我想的,在我檢查了日誌之後,你提出的第一個解決方案是每次迭代執行所有更新,所以我用不同的腳本來完成它。現在它在forEach函數中正常工作。 – Sabaspro 2014-12-03 17:03:20