mongodb c#在数组

时间:2017-04-03 14:50:23

标签: c# mongodb

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

例如,使用MongoDB C#驱动程序,我想更新IWantToUpdate这个值为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

1 个答案:

答案 0 :(得分:0)

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

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);
}

如果有人提出另一个答案,那么这很可能是比我更好的方式,我在这里留下这个答案只是为了表明如果其他人发现自己处于与我相同的死胡同中,可能的前进方向。< / p>