mongo shell默认为安全写入,根据我的理解,在每次回车结束时都会发生。如果你在这样的循环中有代码怎么办:
db.coll1.find().forEach(function(doc){
db.coll2.update({"blah": doc._id}, {$set: {"blahblah": doc.value}});
});
db.getLastError()是针对每次更新发生的,还是仅在上次更新的for循环的最后?或者它是否一次发生在每个更新文档的for循环结束时?
答案 0 :(得分:2)
在交互模式下,shell实际上有w:1
(安全写入),当在循环中运行时,它不会在结束前调用getLastError
。
作为参考,您实际上可以看到@Asya为MongoDB公司工作的评论。
shell使用safe,因为它在每个“命令”之后调用getLastError(即回车)。如果你在循环中写入数据,那么GLE最后只会被调用一次。提供有关如何计划从shell填充集合的更多详细信息 - 可能正确的事情已经发生
答案 1 :(得分:0)
从Sammaye添加回答,如果你想在每次更新通话后拨打GLE,你会做这样的事情:
db.coll1.find().forEach(function(doc){
db.coll2.update({"blah": doc._id}, {$set: {"blahblah": doc.value}}, true);
if(db.getLastError(1)){
printjson(db.getLastError(1));
printjson("failed to update ID: "+doc._id)
};
});
如果最后一个操作失败,你会在循环结束时得到一个重复错误,因为它会返回回车,但除此之外,它几乎就是你所期望的。如果您想要一个简单的测试来重现,只需将value
字段设置为字符串,然后使用$inc
代替$set
- 这将在非数字上失败。