繁体   English   中英

mongodb c#在数组中设置数组值

[英]mongodb c# set array value in an array

如果我的文档包含一个包含数组的数组,该如何更新第二个数组的字段?

例如,使用MongoDB C#驱动程序,我想更新IWantToUpdateThis字段,其中值是John Smith:

{
    { 
        "_id" : 0, 
        "Guff" : "Blah", 
        "FirstArray" : [
            { 
                "Blah" : "Guff", 
                "SecondArray" : [
                    { 
                        "IWantToUpdateThis" : "John Smith", 
                        "ButNotThis" : "Not me" 
                    }, 
                    { 
                        "IWantToUpdateThis" : "Will Smith", 
                        "ButNotThis" : "Not me" 
                    }
                ] 
            }
        ]
    } }

我尝试了多种选择,例如:

var filter = Builders<BsonDocument>.Filter.Eq("FirstArray.SecondArray.IWantToUpdateThis", "John Smith");
var update = Builders<BsonDocument>.Update.Set("FirstArray.SecondArray.$.IWantToUpdateThis", "My New Value");
var result = collection.UpdateOne(filter, update);

但我似乎无法更新该值。

编辑添加:提出问题时使用的MongoDB版本为v3.2.12-69-g45cc6d2

我已经找到了可行的方法,但是我无法相信这是解决问题的最佳方法:

var collection = _database.GetCollection<Model>("Stuff");
var filter = Builders<Model>.Filter.Eq("FirstArray.SecondArray.IWantToUpdateThis", OldValue);
var docIds = collection.Find(filter).Project(x => x.Id).ToList();
foreach (var docId in docIds)
{
    var model = collection.Find(e => e.Id == docId).FirstOrDefault();
    foreach (var first in model.FirstArray)
    {
        foreach(var second in first.SecondArray)
        {
            if (second.IWantToUpdateThis == OldValue)
                second.IWantToUpdateThis = NewValue;
        }
    }
    collection.ReplaceOne(r => r.Id == docId, model);
}

如果有人提出另一个答案,那很可能是比我更好的方法,我在这里留下这个答案只是为了表明如果有人发现自己和我处于同一死胡同中,可能的前进方向。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM