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));
提示:
- 请记住,GUID 提供了糟糕的数据局部性 - 这可能是个问题,也可能是有利的,但大多数数据大致具有创建时局部性,因此
ObjectId
通常是更好的选择。
- 我建议您使用相同的编码风格 - 基于表达式或基于字符串,但您的查询使用基于字符串的表示法,而更新使用表达式
我有 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));
提示:
- 请记住,GUID 提供了糟糕的数据局部性 - 这可能是个问题,也可能是有利的,但大多数数据大致具有创建时局部性,因此
ObjectId
通常是更好的选择。 - 我建议您使用相同的编码风格 - 基于表达式或基于字符串,但您的查询使用基于字符串的表示法,而更新使用表达式