如何更新MongoDB文档中的数组元素匹配条件?

时间:2011-11-01 13:29:02

标签: mongodb

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

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

如何更新特定状态项的时间戳,方法是指定其类型值?

2 个答案:

答案 0 :(得分:16)

从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过滤器

答案 1 :(得分:0)

从 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 的数组元素才应该更新。