使用游标foreach()将_id值复制到同一文档中的其他字段时,无法正常工作

时间:2014-12-17 13:23:37

标签: mongodb

使用游标foreach()将_id值复制到同一文档中的其他字段时,会给出错误的值; 意向: 我有一个消息集合,其中包含一个Message对象。我想在Message对象中添加一个字段“MessageId”,其中包含文档的_id字符串值。但是当我在我的数据库上运行此查询时,第一个文档的MessageId持有第二个文件的_id值,第二个保持第三个值。 以下是查询;

db.messages.find().forEach(
    function(message){
    db.messages.update(
        {"Message.MessageId":{$exists:false}},
        {$set:{"Message.MessageId":message._id+''}}
    )
});

我错了.. ???

1 个答案:

答案 0 :(得分:0)

您的update来电与没有Message.MessageId字段的所有文档匹配,而不仅仅是您尝试定位的字段。将_id: message._id添加到条件参数中,仅定位message代表的文档:

db.messages.find().forEach(
    function(message){
        db.messages.update(
            {_id: message._id, "Message.MessageId":{$exists: false}},
            {$set:{
                "Message.MessageId": message._id+''     
            }}
        );
    }
);

但是,您可以通过在$exists调用中加入find检查来提高效率,这样您只需要对需要更新的文档进行迭代:

db.messages.find({"Message.MessageId":{$exists: false}}).forEach(
    function(message){
        db.messages.update(
            {_id: message._id},
            {$set:{
                "Message.MessageId": message._id+''     
            }}
        );
    }
);