Mongodb删除id为.Net的数组

Mongodb删除id为.Net的数组,mongodb,mongodb-query,mongodb-.net-driver,Mongodb,Mongodb Query,Mongodb .net Driver,我有学生和班级的收藏 类包含一个学生数组。每当编辑学生时,该学生所在的所有班级都会对其进行编辑 因此,当一个学生被删除时,我也希望它从所有班级中删除 现在我必须通过全体学生的考试才能从班上下来 var query = Query.EQ("Students._id", idOfStudent); var update = Update<Class>.Pull(x => x.Students, studentToRemove); 我的学生收藏看起来像 { "_id" :

我有学生和班级的收藏

类包含一个学生数组。每当编辑学生时,该学生所在的所有班级都会对其进行编辑

因此,当一个学生被删除时,我也希望它从所有班级中删除

现在我必须通过全体学生的考试才能从班上下来

var query = Query.EQ("Students._id", idOfStudent);
var update = Update<Class>.Pull(x => x.Students, studentToRemove);
我的学生收藏看起来像

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

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

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

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));
var-joe=newstudent{Name=“joe”,Id=Guid.NewGuid()};
/// ....
var query=query.EQ(p=>p.Id,doc.Id);
var update=update.Pull(r=>r.Students,p=>p.EQ(q=>q.Id,joe.Id));
提示:

  • 记住,guid提供了不好的数据局部性——这可能是一个问题,也可能是有利的,但大多数数据大致都具有创建时局部性,因此
    ObjectId
    通常是更好的选择
  • 我建议您使用相同的编码风格-基于表达式或基于字符串,但您的查询使用基于字符串的表示法,而更新使用表达式

  • 你能给我们看一些班级和学生收藏的样本文件吗?@chridam有那么好吗?谢谢你这么好的回答。谢谢你的提示。问题是。我总是使用基于表达式的,但我只有学生的id。所以在上面的例子中,我没有doc.Id,只有joe.Id。我不会让我做Query.EQ(p=>p.Students.Id,joe.Id),所以我在里面放了一个字符串。啊,我明白了。在这种情况下,您不得不使用字符串语法。
    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));