在mongodb shell javascript forEach函数中写下关注点

时间:2014-01-27 21:48:27

标签: javascript mongodb shell foreach

mongo shell默认为安全写入,根据我的理解,在每次回车结束时都会发生。如果你在这样的循环中有代码怎么办:

db.coll1.find().forEach(function(doc){
    db.coll2.update({"blah": doc._id}, {$set: {"blahblah": doc.value}});
});

db.getLastError()是针对每次更新发生的,还是仅在上次更新的for循环的最后?或者它是否一次发生在每个更新文档的for循环结束时?

2 个答案:

答案 0 :(得分:2)

在交互模式下,shell实际上有w:1(安全写入),当在循环中运行时,它不会在结束前调用getLastError

作为参考,您实际上可以看到@Asya为MongoDB公司工作的评论。

  

shell使用safe,因为它在每个“命令”之后调用getLastError(即回车)。如果你在循环中写入数据,那么GLE最后只会被调用一次。提供有关如何计划从shell填充集合的更多详细信息 - 可能正确的事情已经发生

Setting MongoDB's write concern in shell / shell script

答案 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 - 这将在非数字上失败。