Rah*_*hul 8 c# mongodb mongodb-.net-driver
是否有直接的方法来更新MongoDB中嵌套的实体数组.我MongoDB C# Driver
用于从应用程序进行数据库调用.下面是一个例子:说我有一个Student
集合,其中每个文档都有一个嵌套的数组,Course
其中填充了一些必要的字段Course
,它本身就是一个单独的集合,如:
{
"_id": "234dssfcv456",
"Name": "Jean Douglas",
"Age": 32,
"Courses":
[
{
"_id": "1234",
"Name": "Computer Science",
"Level": "Basic"
},
{
"_id": "3456",
"Name": "Bio Science",
"Level": "Intermediate"
}
]
}
Run Code Online (Sandbox Code Playgroud)
我知道我可以通过索引更新嵌套实体,但我不知道索引,而只知道嵌套Course
对象Id
.
db.College.Student.update(
{"Student._id": "234dssfcv456"},
{$set: {
"Student.$.Courses.1.Level": "Basic"
}}
Run Code Online (Sandbox Code Playgroud)
现在,我正在阅读整个嵌套的课程数组 - >在应用程序端进行修改 - >然后将整个数组传递给更新"Courses"
,并使用将要传递的现有数组替换现有数组.
但是在想,有没有办法可以用Id
可用的方式更新数组中的一个实体.请建议.
***在相关问题部分的右侧,所有显示使用对象项的索引更新嵌套的对象数组,这对我来说是不可能的.
and*_*ian 12
Mongo shell:
> db.students.find( {_id:"234dssfcv456", "Courses._id":"1234"} ).pretty()
> db.students.update( {_id:"234dssfcv456", "Courses._id":"3456"}, { $set: { "Courses.$.Level" : "Updated" } } )
Run Code Online (Sandbox Code Playgroud)
C#Mongo架构:
public class Student {
[BsonId]
[BsonRepresentation(BsonType.String)]
public string Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public Course[] Courses { get; set; }
}
public class Course {
[BsonId]
[BsonRepresentation(BsonType.String)]
public string Id { get; set; }
public string Name { get; set; }
public string Level { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
Lookup Mongo为位置运算符提供文档.驱动程序高于版本2.2.3.3我使用:
var _client = new MongoClient(@"....");
var _database = _client.GetDatabase("...");
var _students = _database.GetCollection<Student>("students");
var filter = Builders<Student>.Filter;
var studentIdAndCourseIdFilter = filter.And(
filter.Eq(x => x.Id, "234dssfcv456"),
filter.ElemMatch(x => x.Courses, c => c.Id == "1234") );
// find student with id and course id
var student = _students.Find(studentIdAndCourseIdFilter).SingleOrDefault();
// update with positional operator
var update = Builders<Student>.Update;
var courseLevelSetter = update.Set("Courses.$.Level", "Updated Level");
_students.UpdateOne(studentIdAndCourseIdFilter, courseLevelSetter);
Run Code Online (Sandbox Code Playgroud)
小智 7
代替update.Set("Courses.$.Level", "Updated Level");
您也可以这样:
update.Set(x => x.Courses[-1].Level, "Updated Level");
Run Code Online (Sandbox Code Playgroud)
资料来源:http : //www.mattburkedev.com/updating-inside-a-nested-array-with-the-mongodb-positional-operator-in-c-number/