2017-01-19 2 views
1

У меня есть подобный документОбновление вложенного массива в Монго с C#

{ 
"_id": "63dafa72f21d48312d8ca405", 
"tasks": [{ 
    "_ref": "63d8d8d01beb0b606314e322", 
    "data": { 
     "values": [{ 
      "key": "Deadline", 
      "value": "2014-10-13" 
     }] 
    } 
}, { 
    "_ref": "84dd046c6695e32322d842f5", 
    "data": { 
     "values": [] 
    } 
}] 
} 

Теперь я хочу, чтобы обновить значение внутри значений, которое внутри данные, если _ref поля сделать сопрягать мой вход.

Моего код до сих пор:

public bool updateProject(Project dbPro, Project pro) 
{ 
    var collection = db.GetCollection<BsonDocument>("projects"); 
    var filter = Builders<BsonDocument>.Filter.Eq("_id", ObjectId.Parse(dbPro.Id)); 
    var update = Builders<BsonDocument>.Update.AddToSetEach("tasks", pro.Tasks); 
    var result = collection.UpdateOne(filter, update); 
    if (result.IsModifiedCountAvailable) 
    { 
     if (result.ModifiedCount == 1) 
     { 
      return true; 
     } 
    } 
    return false; 
} 

На данный момент этот код делает только Append документов, как новые задачи, вместо того, чтобы добавлять значения в согласующих задачи. Может быть, у кого-то есть идея, как добиться такого поведения?

UPDATE

Я попробовал это, как сказал @Shane Oborn. Но он все еще не работает для меня.

  var collection = db.GetCollection<BsonDocument>("projects"); 
     var filter = Builders<BsonDocument>.Filter.Eq("_id", ObjectId.Parse(dbPro.Id)); 
     var update = Builders<BsonDocument>.Update.Push("tags", buildBsonArrayFromTags(pro.Tags)); 
     var result = collection.UpdateOne(filter, update); 
     if (result.IsModifiedCountAvailable) 
     { 
      if (result.ModifiedCount == 1) 
      { 
       return true; 
      } 

     } 


     return false; 
    } 

Вместо того чтобы переопределить данные, он добавляет массив к моему массиву.

enter image description here

UPDATE

ОК вместо толчка я сделал нужно установить. И тогда это сработало.

+1

Посмотрите на [этот вопрос] (http://stackoverflow.com/questions/ 18148166/find-document-with-array-that-contains-a-specific-value), он может вам помочь. –

+0

Спасибо. Я попробую. – Kleisophabo

ответ

2

У меня нет точного кода, доступного, но рядом. У меня есть метод, который выполняет «upserts» (который «добавляет», если новый, или «обновления», если он существует). Это должно заставить вас закрыть:

// The variable "doc" below is a BsonDocument 

var updateRequests = new List<WriteModel<BsonDocument>>(); 
updateRequests.Add(new ReplaceOneModel<BsonDocument>(
    CreateBsonDocumentFilterDefinition(filterKeyName, filterKeyValue), doc) 
    { 
     IsUpsert = true 
    }); 
var writeResult = await collection.BulkWriteAsync(updateRequests); 

Ключевые объекты здесь для вас «ReplaceOneModel» и свойство «IsUpsert» для определения фильтра.

Удачи вам!

UPDATE:

Другой метод, который я указал, что делает обновления в поддокументами выглядит следующим образом:

// Below, "subDocument" is a BsonDocument, and "subDocArrayName" is a string 
// that should match the name of the array that contains your sub-document 
// that will be updated. 

var collection = _database.GetCollection<BsonDocument>(collectionName); 

var builder = Builders<BsonDocument>.Update; 
var update = builder.Push(subDocArrayName, subDocument); 

await collection.UpdateOneAsync(CreateBsonDocumentFilterDefinition(filterKeyName, filterKeyValue), update); 
+0

Я тоже попробую. Спасибо за быструю помощь. – Kleisophabo

+0

Я пробовал свои методы, но это не сработало. Я обновил свой пост – Kleisophabo

+0

ОК, я понял это сейчас. Вместо push я использовал set. И это сработало – Kleisophabo