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

时间:2018-02-16 06:21:12

标签: mongodb mongodb-.net-driver

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

我的收藏名为学生,类似于以下内容。

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

        }
    ],

}

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

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

    }

我也为上面的属性创建了类。

请提出一些想法。

提前致谢

1 个答案:

答案 0 :(得分:1)

最简单的方法是使用$push运算符,但$addToSet也可以使用,具体取决于您的要求。

如果我们在Mongo Shell中构建它,你会得到像

这样的东西
db.students.update({"_id": ObjectId("5a866be6f843b648a0bac9ab")}, 
{
    $push: {
        "MarkList": {
            "Subject": "Physics",
            "Mark": 80,
            "Rank": 10
        }
    }
})

因此将其转换为C#,假设您已经有了一些东西。

  1. 名为IMongoCollection<T>
  2. studentsCol个对象
  3. 该集合中T的类型为Student
  4. 学生的ID存储在变量studentId
  5. 要插入的新对象存储在变量newMark
  6. 在这种情况下,以下代码将完成您正在寻找的内容。

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

    如果您想使用$addToSet,只需将Update.Push更改为Update.AddToSet

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

      

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