我想使用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",
}
我也为上面的属性创建了类。
请提出一些想法。
提前致谢
答案 0 :(得分:1)
最简单的方法是使用$push
运算符,但$addToSet
也可以使用,具体取决于您的要求。
如果我们在Mongo Shell中构建它,你会得到像
这样的东西db.students.update({"_id": ObjectId("5a866be6f843b648a0bac9ab")},
{
$push: {
"MarkList": {
"Subject": "Physics",
"Mark": 80,
"Rank": 10
}
}
})
因此将其转换为C#,假设您已经有了一些东西。
IMongoCollection<T>
studentsCol
个对象
T
的类型为Student
studentId
newMark
在这种情况下,以下代码将完成您正在寻找的内容。
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仅比较文档中字段的子集来确定文档是否与现有数组元素重复。