嵌入式文档属性的多次更新

1gn*_*ter 3 mongodb

我有以下集合:

{ 
"Milestones" : [      
    {       "ActualDate" : null,   
    "Index": 0,
    "Name" : "milestone1",  
    "TargetDate" : ISODate("2011-12-13T22:00:00Z"),         
    "_id" : ObjectId("4ee89ae7e60fc615c42e28d1")},         
    {       "ActualDate" : null,    
    "Index" : 0,    
    "Name" : "milestone2",  
    "TargetDate" : ISODate("2011-12-13T22:00:00Z"),         
    "_id" : ObjectId("4ee89ae7e60fc615c42e28d2") } ]
, 
"Name" : "a", "_id" : ObjectId("4ee89ae7e60fc615c42e28ce") 
}
Run Code Online (Sandbox Code Playgroud)

我想更新明确的文档:已指定_id,里程碑列表._id和ActualDate为空.我dotnet我的代码看起来像:

var query = Query.And(new[] { Query.EQ("_id", ObjectId.Parse(projectId)),
  Query.In("Milestones._id", new BsonArray(values.Select(ObjectId.Parse))), 
 Query.EQ("Milestones.ActualDate", BsonNull.Value) });                

var update = Update.Set("Milestones.$.ActualDate", DateTime.Now.Date);    

Coll.Update(query, update, UpdateFlags.Multi, SafeMode.True);
Run Code Online (Sandbox Code Playgroud)

或者在本机代码中:

db.Projects.update({ "_id" : ObjectId("4ee89ae7e60fc615c42e28ce"), "Milestones._id" : { "$in" : [ObjectId("4ee89ae7e60fc615c42e28d1"), ObjectId("4ee89ae7e60fc615c42e28d2"), ObjectId("4ee8a648e60fc615c41d481e")] }, "Milestones.ActualDate" : null },{ "$set" : { "Milestones.$.ActualDate" : ISODate("2011-12-13T22:00:00Z") } }, false, true)
Run Code Online (Sandbox Code Playgroud)

但只有第一项正在更新.

And*_*ich 10

目前这是不可能的.multi更新中的标志意味着更新多个根文档.位置运算符只能匹配一个嵌套数组项.mongodb jira 有这样的功能.你可以投票并等待.

当前的解决方案只能加载文档,根据需要进行更新,并为每个嵌套的数组ID保存或进行多次原子更新.

来自mongodb.org的文档:

目前,$运算符仅适用于查询中的第一个匹配项

  • @ 1gn1ter:此功能已获批准,但尚未安排:( (2认同)
  • 4年后,是否支持? (2认同)
  • 不,:( https://jira.mongodb.org/browse/SERVER-1243请投票选择功能! (2认同)