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':''}});
我莫名其妙新執行這種蒙戈的操作,所以我將不勝感激爲什麼發生這種情況的解釋。提前致謝!
感謝丹尼爾,我得到它的工作,但我有一個問題。我沒有使用多參數,因爲我認爲這是因爲它是一個forEach函數,它會爲每一行調用update方法,這是如何工作的?如果我使用多參數,它會重複每次迭代的更新嗎?謝謝 – Sabaspro 2014-12-03 13:27:06
那麼,我以前的回答是誤導性的,在這種情況下'多重'論證不是問題。請延長我的歉意。我已經更新了它。填寫免費索取更多詳細信息。我擁有你我的第一個答案;) – 2014-12-03 15:25:16
感謝丹尼爾!,現在它工作就像一個魅力。正如我想的,在我檢查了日誌之後,你提出的第一個解決方案是每次迭代執行所有更新,所以我用不同的腳本來完成它。現在它在forEach函數中正常工作。 – Sabaspro 2014-12-03 17:03:20