2015-04-22 67 views
0

我想要編輯集合中多個數組中可能存在的元素。MongoDB:在數組中編輯元素

public class Class 
{ 
    [BsonId] 
    public Guid Id { get; set;} 
    public string Name {get; set;} 
    public List<Student> Students {get; set;} 
} 

public class Student 
{ 
    [BsonId] 
    public Guid Id {get; set;} 
    public string Name {get; set;} 
    public string Grade {get; set;} 
} 

然後,我的類集合會是什麼樣子

{ 
"_id" : NUUID("..."), 
    "Name" : "Computer Science", 
    "Students" : [ 
     { 
      "_id" : NUUID("..."), 
      "Name" : "Chris" 
      "Grade" : "A" 
     }, 
     { 
      "_id" : NUUID("..."), 
      "Name" : "Bob" 
      "Grade" : "B" 
     } 
} 

我的學生收取會是什麼樣子

{ 
    "_id" : NUUID("..."), 
    "Name" : "Chris Eastwood" 
    "Grade": "C 
} 

現在,當一個學生更新他的信息,我想他的信息以進行更新每班。

我試圖做的事:

// given student that has been edited 

var query = Query.EQ("Students._id", student.Id); 
var update = Update<Class> 
    .Pull(c => c.Students, x => x.EQ(q => q.Id, student.Id)) 
    .Push(c => c.Students, student) 

Context.Class.Update(query,update,UpdateFlags.Multi); 

但是,這並不工作,因爲你

我在想,「不能在同一時間更新學生與學生」有沒有辦法,只是更新所有每個數組中包含該學生的每個班級的學生?

謝謝!

回答

1

我不熟悉C#的驅動程序,但是這是你正在尋找查詢:

db.classes.update({ 
    'Students._id': some_student_id, 
}, { 
    $set: { 
    'Students.$.property': some_value 
    } 
},{ 
    multi: true 
}); 

,你正在尋找的關鍵概念是positional $ operator。它是查詢中匹配的對象的索引。

+0

謝謝何塞。所以你說'$'足夠聰明,可以進入數組的正確元素並更新一個屬性? 示例: $ set:{'Students。$。Name':student.Name} $ set:{'Students。$。Grade':student.Grade} – Beastwood

+0

這是正確的。我一直用這個, –

+0

它會是這樣的:$ set:{'Students。$。Name':student.Name,'Students。$。Grade':student.Grade} –