C#驱动程序2.0 Mongodb UpdateOneAsync

问题描述 投票:8回答:3

`

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

`

如何将课程者ID添加/附加到Student对象的课程列表(首次可能为空)

PS:我知道如何使用以下命令设置字段。我希望它在上述问题的相似之处

await StudentCollection.UpdateOneAsync(a => a.StudentId == studentId, Builders<Student>.Update.Set( a => a.IQ,90));
c# mongodb mongodb-.net-driver
3个回答
13
投票

您已经发现,使用$ 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存储一个空列表,而不是在没有课程时存储一个空列表。


0
投票

这对我有用。当您这样定义“列表”时,它将为空,并且可以使用AddToSet / Push方法。

public List<ObjectId> CoursesList = new List<ObjectId>();

0
投票

唯一需要注意的是数组CourseList为空时,在这种情况下,您必须使用(see also here)下面的代码:

var newListOfObject = new List(){...}等待StudentCollection.UpdateOneAsync(a => a.StudentId == studentId,Builders.Update.Set(a => a.CoursesList,newListOfObject));

否则,您可以使用AddToSet或Push之类的方法在其他答案中进行解释。

© www.soinside.com 2019 - 2024. All rights reserved.