Mongodb 删除 ID 为 .Net 的数组

Mongodb remove array with id .Net

我有 collection 学生和 class。

Class 包含一组学生。每当编辑一个学生时,它也会在该学生所在的所有 classes 中被编辑。

所以当一个学生被删除时,我也希望它从它所在的所有 classes 中删除。

现在我必须通过整个学生才能从 class

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

有没有更好的方法可以让我只输入该学生的学生 ID?

已编辑

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;}  
}

然后我的 class collection 看起来像

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

我的学生 collection 看起来像

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

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

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

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. 我建议您使用相同的编码风格 - 基于表达式或基于字符串,但您的查询使用基于字符串的表示法,而更新使用表达式