【问题标题】:How do I update Array Elements matching criteria in a MongoDB document?如何更新 MongoDB 文档中匹配条件的数组元素?
【发布时间】:2011-12-19 12:17:26
【问题描述】:

我有一个包含数组字段的文档,类似于:

{ 
  "_id" : "....",
  "Statuses" : [
    { "Type" : 1, "Timestamp" : ISODate(...) },
    { "Type" : 2, "Timestamp" : ISODate(...) },
    //Etc. etc.
  ]
}

如何通过指定类型值来更新特定状态项的时间戳?

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    从 MongoDB 3.6 开始,可以使用 $[<identifier>] 位置运算符。与$ 位置运算符不同——每个文档最多更新一个数组元素——$[<identifier>] 运算符将更新每个匹配的数组元素。这对于给定文档可能有多个匹配的数组元素需要更新的场景很有用。

    db.yourCollection.update(
      { _id: "...." },
      { $set: {"Statuses.$[element].Timestamp": ISODate("2021-06-23T03:47:18.548Z")} },
      { arrayFilters: [{"element.Type": 1}] }
    );
    

    arrayFilters 选项匹配要更新的数组元素,$[element] 用于 $set 更新运算符中,表示只有匹配 arrayFilter 的数组元素才应更新。

    【讨论】:

      【解决方案2】:

      从 mongodb shell 你可以这样做

      db.your_collection.update(
          { _id: ObjectId("your_objectid"), "Statuses.Type": 1 },
          { $set: { "Statuses.$.Timestamp": "new timestamp" } }
      )
      

      所以 c# 等效

      var query = Query.And(
          Query.EQ("_id", "your_doc_id"),
          Query.EQ("Statuses.Type", 1)
      );
      
      var result = your_collection.Update( 
          query, 
          Update.Set("Statuses.$.Timestamp", "new timestamp", UpdateFlags.Multi,SafeMode.True)
      ); 
      

      这将更新特定文档,如果您想更新整个集合,可以删除 _id 过滤器

      【讨论】:

      • 除了 id 之外,有没有办法更新整个对象?
      • 值得一提的是它只会更新第一个匹配元素。
      • @JohanWillfred — 我添加了一个解决可能存在多个匹配数组元素的情况的答案:stackoverflow.com/a/68093337/1108305
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-04
      • 2017-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多