我有一个带有数组字段的文档,类似于:
{
"_id" : "....",
"Statuses" : [
{ "Type" : 1, "Timestamp" : ISODate(...) },
{ "Type" : 2, "Timestamp" : ISODate(...) },
//Etc. etc.
]
}
如何更新特定状态项的时间戳,方法是指定其类型值?
答案 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
的数组元素才应该更新。