【问题标题】:mongodb update field async drivermongodb更新字段异步驱动程序
【发布时间】:2013-03-02 12:39:22
【问题描述】:

如何使用 mongodb allanbank 异步驱动更新集合中的字段?

当我说

db.getCollection("coll_name").update( //$NON-NLS-1$
                 BuilderFactory.start().add("_id", docObjectId),
                 BuilderFactory.start().add("field", value)); //$NON-NLS-1$

我将必要的字段更新为新值,但文档中的所有其他字段都消失了。换句话说,$set 在 mongo shell 中的类比是什么?

【问题讨论】:

    标签: mongodb asynchronous driver


    【解决方案1】:

    您需要将 $set 运算符直接用于子文档。例如,

    DocumentBuilder update = BuilderFactory.start();
    update.push("$set").add("field", value); //$NON-NLS-1$
    
    db.getCollection("coll_name").update( //$NON-NLS-1$
                 BuilderFactory.start().add("_id", docObjectId),
                 update); 
    

    【讨论】:

      【解决方案2】:

      我非常感谢 Rob Moore 的回答,他的帮助非常宝贵。但有一点不准确:我必须添加 pop() 以便一切正常。所以:

      DocumentBuilder update = BuilderFactory.start();
      update = (DocumentBuilder)update.push("$set").add("field", value).pop(); //$NON-NLS-1$ //$NON-NLS-2$
      
      db.getCollection("coll").update( //$NON-NLS-1$
          BuilderFactory.start().add("_id", docObjectId), //$NON-NLS-1$
          update);
      

      【讨论】:

      • 您使用的是什么版本的驱动程序?如果我当前的版本不起作用,那是一个错误。我忘记了答案的第一个版本中的流行音乐,我通过将更新构造拉到更新调用之外编辑为不需要。在您的版本(也可以)中,您不需要将 pop() 和分配回“更新”。 DocumentBuilder 跟踪其子构建器并在构建时将它们解析为最终形式。
      • @RobMoore 我还需要 pop() 才能使用最新的 2.0.1 驱动程序版本正常工作。如果不是 $set 操作符就丢失了
      • @lujop 你介意用一个简单的测试用例写一个问题吗? github.com/allanbank/mongodb-async-driver/issues 谢谢罗伯。
      • @RobMoore 这是我的错,我对建造者感到困惑。如果使用了您的确切代码,并且您在创建构建器时在该位置保存了引用,则它可以正常工作。问题是我使用了在构建的最后阶段获得的参考。谢谢
      猜你喜欢
      • 2016-03-13
      • 1970-01-01
      • 2017-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-02
      • 1970-01-01
      • 2013-04-26
      相关资源
      最近更新 更多