2016-08-08 24 views
3

Gibt es eine einfache Möglichkeit, verschachtelte Array von Entitäten in MongoDB zu aktualisieren. Ich benutze MongoDB C# Driver für den DB-Aufruf von der Anwendung. Unten ist ein exmaple: ich habe eine Student Sammlung haben, wobei jedes Dokument eine verschachtelte Anordnung von Course mit einigen notwendigen Felder ausgefüllt hat und Course selbst eine getrennte Sammlung wie ist:Update-Eigenschaft in verschachtelten Array von Entitäten in MongoDB

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

Ich weiß, dass ich die verschachtelte Einheit aktualisieren per Index etwas wie unten, aber ich kenne den Index nicht und kenne nur das verschachtelte Course Objekt Id nur.

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

Im Moment lese die gesamte verschachtelte Array von Kursen -> die Änderung bei Anwendung Ende tun -> vorbei dann das gesamte Array für die Aktualisierung mit dem filedname "Courses" die das bestehende Array mit dem ersetzen wird bestanden.

Aber dachte, gibt es eine Möglichkeit, eine Entität in Array mit der Id zur Verfügung zu aktualisieren. Bitte vorschlagen.

*** Auf der rechten Seite in Verwandten Frage Abschnitt alle Shows die verschachtelte Array von Objekten mit dem Index der Objektposition zu aktualisieren, das für mich nicht eine Möglichkeit.

Antwort

4

Mongo Schale:

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

C# Mongo schema:

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

Lookup Mongo Dokumentation für die positional operator. Mit Treiber höher als Version 2.2.3.3 Ich verwende:

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

Echt nette Antwort. Schätzen Ihre Bemühungen. Danke Kumpel :) – Rahul