Mongodb删除id为.Net的数组

时间:2015-04-17 02:12:21

标签: mongodb mongodb-query mongodb-.net-driver

我有学生和班级的收藏。

Class包含一系列学生。每当编辑学生时,它也将在学生所在的所有课程中进行编辑。

因此,当学生被删除时,我也希望将其从所有课程中删除。

现在我不得不让整个学生从课堂上拉出来

var query = Query.EQ("Students._id", idOfStudent);
var update = Update<Class>.Pull(x => x.Students, studentToRemove);

有没有更好的方法来拉我可以传递该学生的学生ID?

EDITED

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

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

然后我的课程集合看起来像

{
    "_id" : NUUID("..."),
    "Grade" : "5th",
    "Students" : [
           {
              "_id" : NUUID("..."),
               "Name" : "Chris"
           },
            {
              "_id" : NUUID("..."),
               "Name" : "Bob"
           }
}

我的学生收藏品看起来像

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

当有人删除学生'Chris'时,他们会提供一个用于查找学生并将其删除的ID,但我也想获取该ID并将该学生从他们所在的所有课程中拉出来。

1 个答案:

答案 0 :(得分:1)

是的,您可以使用学生中的唯一标识符:

var joe = new Student { Name = "Joe", Id = Guid.NewGuid() };
/// ....
var query = Query<Class>.EQ(p => p.Id, doc.Id);
var update = Update<Class>.Pull(r => r.Students, p => p.EQ(q => q.Id, joe.Id));

提示:

  1. 请记住,GUID提供了错误的数据位置 - 这可能是一个问题,或者它可能是有利的,但大多数数据大致具有创建时地点,因此ObjectId通常是更好的选择。
  2. 我建议您使用相同的编码样式 - 基于表达式或基于字符串,但您的查询使用基于字符串的表示法,而更新使用表达式