2015-04-22 37 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} –