2016-08-08 3 views
3

Есть ли прямой способ обновления вложенного массива объектов в MongoDB. Я использую MongoDB C# Driver для вызова БД из приложения. Ниже приводится exmaple: скажем, у меня есть Student коллекцию, где каждый документ имеет вложенную массив Course с некоторыми необходимыми полями заселена и Course само по себе является отдельной коллекции, как:Обновить свойство в вложенном массиве объектов в MongoDB

{ 
"_id": "234dssfcv456", 
"Name": "Jean Douglas", 
"Age": 32, 
"Courses": 
    [ 
    { 
     "_id": "1234", 
     "Name": "Computer Science", 
     "Level": "Basic" 
    }, 
    { 
     "_id": "3456", 
     "Name": "Bio Science", 
     "Level": "Intermediate" 
    } 
    ] 
} 

Я знаю, что я могу обновить вложенную сущность по индексу что-то вроде ниже, но я не знаю индекса и скорее знаю только вложенный Course объект Id.

db.College.Student.update(
    {"Student._id": "234dssfcv456"}, 
    {$set: { 
     "Student.$.Courses.1.Level": "Basic" 
    }} 

Прямо сейчас, я читаю весь вложенный массив курсов -> делать изменения в конце приложения -> затем передать весь массив для обновления с filedname "Courses", который собирается заменить существующий массив с одним прошло.

Но думал, есть ли способ, который я могу обновить один объект в массиве с доступным Id. Пожалуйста, предложите.

*** На правой стороне в связанную вопроса раздела все шоу обновляют вложенный массив объектов с использованием индекса элемента объекта, который не является возможностью для меня.

ответ

4

Монго оболочки:

> db.students.find({_id:"234dssfcv456", "Courses._id":"1234"}).pretty() 
> db.students.update({_id:"234dssfcv456", "Courses._id":"3456"}, { $set: { "Courses.$.Level" : "Updated" } }) 

C# Монго схема:

public class Student { 
    [BsonId] 
    [BsonRepresentation(BsonType.String)] 
    public string Id { get; set; } 
    public string Name { get; set; } 
    public int Age { get; set; } 
    public Course[] Courses { get; set; } 
} 

public class Course { 
    [BsonId] 
    [BsonRepresentation(BsonType.String)] 
    public string Id { get; set; } 
    public string Name { get; set; } 
    public string Level { get; set; } 
} 

Поиск Mongo документы для positional operator. С водителем выше версии 2.2.3.3 я использую:

var _client = new MongoClient(@"...."); 
    var _database = _client.GetDatabase("..."); 
    var _students = _database.GetCollection<Student>("students"); 

    var filter = Builders<Student>.Filter; 
    var studentIdAndCourseIdFilter = filter.And(
    filter.Eq(x => x.Id, "234dssfcv456"), 
    filter.ElemMatch(x => x.Courses, c => c.Id == "1234")); 
    // find student with id and course id 
    var student = _students.Find(studentIdAndCourseIdFilter).SingleOrDefault(); 

    // update with positional operator 
    var update = Builders<Student>.Update;  
    var courseLevelSetter = update.Set("Courses.$.Level", "Updated Level"); 
    _students.UpdateOne(studentIdAndCourseIdFilter, courseLevelSetter); 
+0

Реальный хороший ответ. Оцените свои усилия. Спасибо друг :) – Rahul

Смежные вопросы