【问题标题】:Update property in nested array of entities in MongoDB更新 MongoDB 中嵌套实体数组中的属性
【发布时间】:2016-08-08 22:09:01
【问题描述】:

是否有一种直接的方式来更新 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" 
    }
  ] 
}

我知道我可以通过索引更新嵌套实体,如下所示,但我不知道索引,而只知道嵌套的 Course 对象 Id

db.College.Student.update(
    {"Student._id": "234dssfcv456"}, 
    {$set: {
        "Student.$.Courses.1.Level": "Basic"
    }}

现在,我正在读取整个嵌套的课程数组 -> 在应用程序端进行修改 -> 然后使用文件名 "Courses" 传递整个数组以进行更新,这将用传递的数组替换现有数组。

但是在想,有没有一种方法可以使用可用的Id 更新数组中的一个实体。请提出建议。

*** 在 Related 问题部分的右侧,所有显示使用对象项的 index 更新嵌套的对象数组,这对我来说是不可能的.

【问题讨论】:

    标签: c# mongodb mongodb-.net-driver


    【解决方案1】:

    蒙古壳:

    > db.students.find( {_id:"234dssfcv456", "Courses._id":"1234"} ).pretty()
    > db.students.update( {_id:"234dssfcv456", "Courses._id":"3456"}, { $set: { "Courses.$.Level" : "Updated" } } )
    

    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; }
    }
    

    查找 positional operator 的 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);
    

    【讨论】:

    • 真正的好答案。欣赏你的努力。谢谢队友:)
    【解决方案2】:

    你也可以这样来代替update.Set("Courses.$.Level", "Updated Level");

    update.Set(x => x.Courses[-1].Level, "Updated Level");
    

    来源:http://www.mattburkedev.com/updating-inside-a-nested-array-with-the-mongodb-positional-operator-in-c-number/

    【讨论】:

    • 我知道这是旧的,它帮助我解决了类似的问题。更进一步,您将如何同时更新多个课程?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    相关资源
    最近更新 更多