我想编辑一个可能存在于集合中多个数组中的元素。
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);
但这不起作用,因为你不能同时更新学生和学生&#34;
我想知道有没有办法只为每个包含该学生的班级更新每个数组中的所有学生?
谢谢!
答案 0 :(得分:1)
我不熟悉c#驱动程序,但这是您要查找的查询:
db.classes.update({
'Students._id': some_student_id,
}, {
$set: {
'Students.$.property': some_value
}
},{
multi: true
});
您正在寻找的关键概念是positional $ operator。它是查询中匹配的对象的索引。