使用游标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+''}}
)
});
我错了.. ???
答案 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+''
}}
);
}
);