【问题标题】:Write concern in mongodb shell javascript forEach function在 mongodb shell javascript forEach 函数中编写关注点
【发布时间】:2014-02-18 23:22:20
【问题描述】:

mongo shell 默认为安全写入,据我了解,这发生在每个回车符的末尾。如果你有这样的循环代码怎么办:

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

db.getLastError() 是在每次更新时发生还是仅在最后一次更新时 for 循环的最后发生?还是在每个更新的文档的 for 循环结束时都发生一次?

【问题讨论】:

    标签: javascript mongodb shell foreach


    【解决方案1】:

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

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

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

    Setting MongoDB's write concern in shell / shell script

    【讨论】:

    • 对,但我的问题是关于所有更新文档的写入安全性。最后调用的 GLE 是否仅适用于 for 循环的最后一次迭代,还是一次检查每个更新的文档?所以说 for 循环运行超过 10 个文档。如果前 9 次写入失败但 #10 成功,我会知道这 9 次失败吗?
    • @JoshKim GLE 只会做最后一次操作,即最后一次更新
    • @JoshKim 如果您想了解其他人,您需要自己致电 GLE
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-04
      相关资源
      最近更新 更多