2017-04-03 13 views
0

配列を含む配列を持つドキュメントがある場合、どのようにして2番目の配列のフィールドを更新できますか?mongodb c#配列の配列の値を設定する

例えば、MongoDBのC#のドライバを使用して、私は価値がジョン・スミスであるフィールドIWantToUpdateThisを更新する:

{ 
    { 
     "_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

答えて

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

誰もが別の答えを思い付く場合、私のものよりも良い方法である可能性が非常に高い、と誰が自分自身で見つける必要があり、私は前方にのみ可能な方法を示すために、ここでこの答えを残します私と同じ終わり。

関連する問題