当前位置: 首页 > 面试题库 >

如何使用子文档数组更新MongoDB文档

井修雅
2023-03-14
问题内容

我正在使用MongoDB数据库,该数据库的收集模型包括 班级学生学科 和[学术] 表现 。以下是基于猫鼬的架构和模型:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var ObjectId = Schema.Types.ObjectId;

// SUBJECT collection
var subjectSchema = new Schema({
    name        : { type: String, required: true },
    category    : { type: String, required: true }
});
var Subject = mongoose.model('Subject', subjectSchema);

// STUDENT collection
var studentSchema = new Schema({
    name        : { type: String, required: true },
    grade       : { type: Number, required: true }
});
var Student = mongoose.model('Student', studentSchema);

// PERFORMANCE collection
var performanceSchema = new Schema({
    subjectId   : { type: ObjectId, ref: Subject.modelName, required: true },
    score       : { type: Number, required: true },
    maximum     : { type: Number, required: true },
    grade       : { type: String, required: true }
});
var Performance = mongoose.model('Performance', performanceSchema);

// *Note*: This is just to use as a sub-document schema, and not as a collection
var classStudentSchema = new Schema({
    studentId   : { type: ObjectId, ref: Student.modelName, required: true },
    performance : [performanceSchema]
}, { _id: false });

// CLASS collection
var classSchema = new Schema({
    name        : { type: String, required: true },
    scores      : [classStudentSchema]
});
var Class = mongoose.model('Class', classSchema);

class集合的文件是最复杂的地段; 示例文档为:

{
  "_id" : ObjectId("57758f15f68da08c254ebee1"),
  "name" : "Grade 5 - Section A",
  "scores" : [{
    "studentId" : ObjectId("5776bd36ffc8227405d364d2"),
    "performance": [{
      "subjectId" : ObjectId("577694ecbf6f3a781759c54a"),
      "score" : 86,
      "maximum" : 100,
      "grade" : "B+"
    }, {
      "subjectId" : ObjectId("5776ffe1804540e29c602a62"),
      "score" : 74,
      "maximum" : 100,
      "grade" : "A-"
    }]
  }, {
    "studentId" : ObjectId("5776bd36ffc8227405d364d5"),
    "performance": [{
      "subjectId" : ObjectId("577694ecbf6f3a781759c54a"),
      "score" : 94,
      "maximum" : 100,
      "grade" : "A"
    }, {
      "subjectId" : ObjectId("5776ffe1804540e29c602a62"),
      "score" : 81,
      "maximum" : 100,
      "grade" : "A"
    }]
  }]
}

我能够使用以下代码检索现有的班级文档并将其添加到分数中:

Class.findOne({ name: 'Grade 5 - Section A' }, function(err, class) {
  if (err) throw err;
  Student.findOne({ name: 'John Doe' }, function(err, student) {
    if (err) throw err;
    class.scores.push({
      studentId: student.id
    });
  };
});

但是,如何添加/更新/删除该特定学生的成绩?我需要能够class通过以下方式与集合进行交互:

  • 检索所有学生或特定学生的分数(检索scores数组中的特定元素)
  • 为特定主题添加/更新/删除特定学生的分数(在更新或删除的情况下,检索scores[n].performance数组中的特定元素;对于添加或添加到同一数组中。

问题答案:

有几种方法可以逐步解决

检索所有学生或特定学生的分数(检索分数数组中的特定元素)

Class.findOne({ name: 'Grade 5 - Section A'})
     .populate('scores.studentId')
     .exec(function(err, class) {
       if (err) throw err;
       //now class.scores.studentId becomes ObjectStudent
       //hence you have all scores for all students
});

为特定主题添加/更新/删除特定学生的分数(在更新或删除的情况下,在scores [n]
.performance数组中检索特定元素;对于添加或添加到同一数组。

Class.findOneAndUpdate({name: 'Grade 5 - Section A'
                        ,'scores.studentId': ObjectId('5776bd36ffc8227405d364d2')
                        , 'scores.performance.subjectId' : ObjectId('577694ecbf6f3a781759c54a')}
                        , {$set: {scores.performance. score: 50}}
                        , function(err, data) {
           if (err) throw err
    });

希望对您有所帮助



 类似资料:
  • 我有一份这样的文件: 我想通过将其与数量字段(2*800)相乘来更新价格字段,其中的结果将更新/分配给价格。(对于本例,价格更新为1600)。 更新后的文档: 我的选择查询如下: 我怎样才能做到这一点?

  • 将mongodb与pymongo一起使用,我有以下文档: 我想更新示例子文档(这是一个数组元素,因为可能有多个示例)。我有以下代码,但它不工作... 谁能告诉我这个有什么问题吗?

  • 我有一个mongodb集合的mongoose模式,我将其定义如下: 在数据库集合中,我当前有一个文档,它包含除以外的所有属性的值,用于测试目的。我有一个服务器endpoint,当被调用时,它应该发出一个PUT请求来更新文档并向sketches数组中添加一个对象: 在这个web服务中,我基本上试图通过用户名选择用户文档,用户名作为参数传递给url字符串,如下所示: 由于某种原因,当我尝试使用具有以下

  • 我是新来的mongo。我有以下收藏。 文件: 请求: 文档集合中的typeId是文档类型的id,其中请求中的typeId是也可以为空的外部字段。如何获得以下输出。

  • 主要内容:update() 方法,save() 方法在 MongoDB 中,可以使用 update() 和 save() 方法来更新集合中的文档。其中 update() 方法可以更新现有文档中的值,而 save() 方法则可以使用传入文档来替换已有文档。 update() 方法 update() 方法用于更新现有文档中的值,其语法格式如下: db.collection_name.update(     <query>,     <update>,

  • 问题内容: 我在子文档中有这样的数组 我可以过滤> 3的子文档吗 我的预期结果如下 我尝试使用,$elemMatch但返回数组中的第一个匹配元素 我的查询: 结果返回数组中的一个元素 我尝试使用聚合与$match但不起作用 返回数组中的所有元素 我可以过滤数组中的元素以获得预期结果吗? 问题答案: 使用是正确的方法,但在应用数组之前需要先对数组进行过滤,以便可以过滤单个元素,然后用于将其放回原处: