【问题标题】:MongoDB $addtoSet and $set in the same operationMongoDB $addtoSet 和 $set 在同一个操作中
【发布时间】:2015-03-23 05:04:32
【问题描述】:

在我的 Meteor/javascript 应用程序中,我试图通过 $addToSet 在该文档的某个部分更新特定的 MongoDB 文档,然后在同一文档的不同部分通过 $set 更新。这两个部分之间没有重叠,所以从我在网上阅读的内容来看,它应该是安全的。但我似乎无法使语法正确。如何在一个 javascript 命令中执行这两个操作?下面作为两个单独的命令工作,我认为如果它们可以组合成一个对 Mongo 的写入会更快。

Collection.update(
  {_id: documentId},
  {$addToSet:
    {data:
      {$each: newData}
    }
  }
);
Collection.update(
  {_id: documentId},
  {$set:
    {lastTxn: lastTxn,
     updatedAt: new Date()}
  }
);

【问题讨论】:

    标签: javascript node.js mongodb meteor mongodb-query


    【解决方案1】:

    只要它们不在同一条路径上(这是你不能做的一件事),那就完全没问题了。 $set 和 $addToSet 操作只是“更新文档”的顶级“键”:

     Collection.update(
      { "_id": documentId },
      {
        "$addToSet": { "data": { "$each": newData } },
        "$set": { 
           "lastTxn": lastTxn,
           "updatedAt": new Date()
        }
      }
    );
    

    【讨论】:

    • 谢谢!您的答案中的单个命令是否比我的问题中的双重命令更快?
    • @JonCursi 一趟服务器肯定更快,一般来说是一次操作。我同时更新多个字段是有意义的,对吗?这就是发生的所有事情,只是使用不同类型的操作,因为 MongoDB 是支持该操作的文档存储,而不是 SQL 表。实际上,可以将其视为将父文档和相关文档合二为一的“交易”。
    • 原子写入似乎比任何 ~ms 速度考虑更重要。
    猜你喜欢
    • 2020-08-16
    • 1970-01-01
    • 2012-02-22
    • 2015-07-07
    • 2022-11-29
    • 1970-01-01
    • 2017-05-30
    • 2017-06-30
    • 2013-11-04
    相关资源
    最近更新 更多