Mongo forEach函数仅在第一行执行更新

时间:2014-12-03 12:31:42

标签: javascript mongodb database

我在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的这种操作有点新手,所以我很感激为什么会发生这种情况的解释。提前谢谢!

1 个答案:

答案 0 :(得分:1)

问题在于更新查询投影。

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

应使用 _id 字段访问任何文档的ID。在这种情况下, id 会返回undefined

按如下方式更新它(通知下划线)可以解决问题:

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