C# 驱动程序 2.0 Mongodb UpdateOneAsync
C# driver 2.0 Mongodb UpdateOneAsync
public class Student
{
public long StudentId {get; set;}
public string Fname {get; set;}
public string Lname {get; set;}
public List<ObjectId> CoursesList {get; set;}
public int IQ {get;set;}
}
public class Courses
{
[BsonId]
public ObjectId Id { get; set; }
public string CourseNumber{get; set;}
public string CourseName{get; set;}
}
我如何 add/append 一个学生对象的课程列表(第一次可能为空)的课程 ID
PS:我知道如何使用以下命令设置字段。我希望它与上述问题类似
await StudentCollection.UpdateOneAsync(a => a.StudentId == studentId, Builders<Student>.Update.Set( a => a.IQ,90));
正如您已经发现的那样,使用 $addToSet 的 C# 代码是:
var filter = Builders<Student>.Filter.Eq(s => s.StudentId, studentId);
var update = Builders<Student>.Update.AddToSet(s => s.CoursesList, courseId);
var result = await collection.UpdateOneAsync(filter, update);
但是,如果 CourseList 成员已作为 null 存储在集合中,则 $addToSet 将不起作用。服务器要求 $addToSet 的现有值是一个数组(它可以是一个空数组)。
最简单的解决方案是在没有课程时为 CoursesList 存储一个空列表而不是 null。
这对我有用。当你像这样定义 "List" 时,它将是空的并且可以使用 AddToSet/Push 方法。
public List<ObjectId> CoursesList = new List<ObjectId>();
唯一需要注意的情况是数组 CourseList 为 null 时,在这种情况下您必须使用下面的代码 (see also here):
var newListOfObject = new List<ObjectId>(){...}
await StudentCollection.UpdateOneAsync(a => a.StudentId == studentId, Builders<Student>.Update.Set( a => a.CoursesList, newListOfObject));
否则你可以像其他答案中解释的那样使用 AddToSet 或 Push。
public class Student
{
public long StudentId {get; set;}
public string Fname {get; set;}
public string Lname {get; set;}
public List<ObjectId> CoursesList {get; set;}
public int IQ {get;set;}
}
public class Courses
{
[BsonId]
public ObjectId Id { get; set; }
public string CourseNumber{get; set;}
public string CourseName{get; set;}
}
我如何 add/append 一个学生对象的课程列表(第一次可能为空)的课程 ID
PS:我知道如何使用以下命令设置字段。我希望它与上述问题类似
await StudentCollection.UpdateOneAsync(a => a.StudentId == studentId, Builders<Student>.Update.Set( a => a.IQ,90));
正如您已经发现的那样,使用 $addToSet 的 C# 代码是:
var filter = Builders<Student>.Filter.Eq(s => s.StudentId, studentId);
var update = Builders<Student>.Update.AddToSet(s => s.CoursesList, courseId);
var result = await collection.UpdateOneAsync(filter, update);
但是,如果 CourseList 成员已作为 null 存储在集合中,则 $addToSet 将不起作用。服务器要求 $addToSet 的现有值是一个数组(它可以是一个空数组)。
最简单的解决方案是在没有课程时为 CoursesList 存储一个空列表而不是 null。
这对我有用。当你像这样定义 "List" 时,它将是空的并且可以使用 AddToSet/Push 方法。
public List<ObjectId> CoursesList = new List<ObjectId>();
唯一需要注意的情况是数组 CourseList 为 null 时,在这种情况下您必须使用下面的代码 (see also here):
var newListOfObject = new List<ObjectId>(){...}
await StudentCollection.UpdateOneAsync(a => a.StudentId == studentId, Builders<Student>.Update.Set( a => a.CoursesList, newListOfObject));
否则你可以像其他答案中解释的那样使用 AddToSet 或 Push。