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

Red*_*dth 6 mongodb

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

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

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

Ram*_*Vel 19

从mongodb shell你可以做到这一点

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

所以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)
); 
Run Code Online (Sandbox Code Playgroud)

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

  • 值得一提的是,它将仅更新第一个匹配元素。 (4认同)

M. *_*tin 11

从 MongoDB 3.6 开始,$[<identifier>]可以使用位置运算符。与$位置运算符 \xe2\x80\x94\xc2\xa0(每个文档最多更新一个数组元素 \xe2\x80\x94)不同,该$[<identifier>]运算符将更新每个匹配的数组元素。这对于给定文档可能有多个需要更新的匹配数组元素的情况非常有用。

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

arrayFilters选项与要更新的数组元素相匹配,并且在更新运算符$[element]中使用$set来指示仅arrayFilter应更新与 匹配的数组元素。

\n