更新MongoDB中嵌套的实体数组中的属性

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/