2016-08-08 16 views
3

MongoDB内のエンティティのネストされた配列を直接的に更新する方法はありますか?私はMongoDB C# Driverを使ってアプリケーションからDB呼び出しを行っています。以下はexmapleです:私はのように、各文書はそれ自体でいくつかの必要な人口のフィールドとCourseCourseのネストされた配列は、分別収集されたStudentコレクションを持っていると言う: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" 
    }} 

は、コースの全体ネストされた配列を読んでいます - >アプリケーションの終了時に変更を行う - >その後、1で、既存の配列を置き換えるために起こっているfiledname "Courses"と更新のために全体の配列を渡します合格。

しかし、Idが利用可能な配列で1つのエンティティを更新できる方法があるかと考えていました。提案してください。

*** 関連質問セクションの右側には、すべてのショーは私の可能性はない対象項目のインデックスを使用してオブジェクトのネストされた配列を更新します。

答えて

4

Mongoのシェル:

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

C#Mongoのスキーマ:

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; } 
} 
positional operatorため

参照Mongoのドキュメント。 バージョン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

関連する問題