我在forEach函数中执行更新时遇到问题,它只更新第一行。
好的,所以我想创建一个更新文档某些字段的查询,但是我有以下限制:
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':''}});
我对于执行mongo的这种操作有点新手,所以我很感激为什么会发生这种情况的解释。提前谢谢!
答案 0 :(得分:1)
问题在于更新查询投影。
db.events_migration.update({'_id':doc1.id} ...
应使用 _id 字段访问任何文档的ID。在这种情况下, id 会返回undefined
。
按如下方式更新它(通知下划线)可以解决问题:
db.events_migration.update({'_id':doc1._id} ...