2015-08-07 2 views
2

Используя версию MongoDB C# версии 2.0.1 с Mongodb 3.0, можно ли использовать типизированные методы для обновления элемента документа поля массива?Как использовать типизированные методы драйвера C# Mongodb Обновить поля элементов документа массива

Например, у меня есть следующий документ:

{ 
    Name:"Ken", 
    ContactNo:[ { Number:"123", Type:"Mobile"}, 
        { Number:"456", Type:"Office"}, 
        { Number:"531", Type:"Fax"} 
       ] 
} 

Как сделать следующие операции с использованием типизированных методов # C:

1) Обновление Type поля для всех элементов ContactNo массива в быть «PABX»

2) Обновление Type поле ContactNo массива документа элемента которого Number поле равно "123 «быть» Fiber «

3) Обновление первый элемент Contact массива и установите его Type поле, чтобы быть» Unknown "

ответ

2
  1. Это не возможно в настоящее время, чтобы обновить все элементы в массиве используя оператор позиционирования. См. this StackOverflow question и this MongoDB issue. Тем не менее, если вы знаете количество элементов в массиве раньше времени (или может получить его как-то), то это будет работать:

    var numberOfElementsInArray = 3; 
    var filter = Builders<Contact>.Filter.Eq("Name", "Ken"); 
    var update = Builders<Contact>.Update.Combine(Enumerable.Range(0, numberOfElementsInArray) 
         .Select(i => Builders<Contact>.Update.Set("ContactNo." + i + ".Type", "PABX"))); 
    collection.UpdateOneAsync(filter, update).Wait(); 
    
  2. Этот код установит Type свойство элемента в ContactNo массиве с Number из 123 в Fiber:

    var filter = Builders<Contact>.Filter.And(
         Builders<Contact>.Filter.Eq("Name", "Ken"), 
         Builders<Contact>.Filter.Eq("ContactNo.Number", "123")); 
    var update = Builders<Contact>.Update.Set("ContactNo.$.Type", "Fiber"); 
    collection.UpdateOneAsync(filter, update).Wait(); 
    
  3. Этот код установит Type свойство первого элемента в ContactNo массива Unknown:

    var filter = Builders<Contact>.Filter.Eq("Name", "Ken"); 
    var update = Builders<Contact>.Update.Set("ContactNo.0.Type", "Unknown"); 
    collection.UpdateOneAsync(filter, update).Wait(); 
    

Обратите внимание, что весь этот код предполагает, что у вас есть класс с именем Contact, что соответствует данным, указанному в вашем вопросе (ваш фактический класс можно назвать что-то еще, я просто назвал его Contact здесь), и что collection является экземпляром IMongoCollection<Contact>.

Например:

var client = new MongoClient("mongodb://localhost:27017"); 
var collection = client.GetDatabase("your database").GetCollection<Contact>("your collection name"); 
+0

Высокий, хорошо письменный ответ спасибо. – Lostaunaum