使用 C# 驱动程序在嵌套的 mongo 集合中添加新对象

Rau*_*auf 3 mongodb mongodb-.net-driver

我想Mongo使用在嵌套集合中添加一个新对象C# drivers,请在下面的示例 json 中找到。

我有类似下面的称为学生的集合。

{
    "_id" : ObjectId("5a866be6f843b648a0bac9ab"),
    "FIstName" : "Bob",
    "LastName" : "mark", 
    "MarkList" : [ 
        {
            "SUbject" : "science",
            "Mark" : "80",
            "Rank" : "10",

        }
    ],

}
Run Code Online (Sandbox Code Playgroud)

现在我想使用 C# 驱动程序在 Marklist 数组下插入一个新的主题对象,

    {
        "SUbject" : "Physics",
        "Mark" : "80",
        "Rank" : "10",

    }
Run Code Online (Sandbox Code Playgroud)

我还为上述属性创建了类。

请提出一些想法。

提前致谢

Pet*_*ano 5

最简单的方法是使用$push运算符,但$addToSet也可以根据您的要求工作。

如果我们在 Mongo Shell 中构建它,你会得到类似的东西

db.students.update({"_id": ObjectId("5a866be6f843b648a0bac9ab")}, 
{
    $push: {
        "MarkList": {
            "Subject": "Physics",
            "Mark": 80,
            "Rank": 10
        }
    }
})
Run Code Online (Sandbox Code Playgroud)

因此,将其转换为 C#,让我们假设您已经掌握了一些东西。

  1. 一个IMongoCollection<T>对象叫studentsCol
  2. T集合中的类型是Student
  3. 学生的Id存储在变量中 studentId
  4. 要插入的新对象存储在变量中 newMark

在这种情况下,以下代码将完成您要查找的内容。

studentsCol.UpdateOneAsync(
    Builders<Student>.Filter.Eq(x => x.Id, studentId),
    Builders<Student>.Update.Push(x => x.MarkList, newMark));
Run Code Online (Sandbox Code Playgroud)

如果要使用$addToSet,只需更改Update.PushUpdate.AddToSet.

注意:如果您选择,$addToSet请务必阅读 MongoDB 如何确定文档是否已存在于数组中。

如果值为文档,则如果数组中存在的文档与要添加的文档完全匹配,则MongoDB确定该文档是重复的;即现有文档具有完全相同的字段和值,并且这些字段的顺序相同。因此,字段顺序很重要,您不能指定 MongoDB 仅比较文档中字段的子集来确定文档是否与现有数组元素重复。