首页 > 解决方案 > 在猫鼬中使用嵌入式文档更新文档不起作用

问题描述

我有一个名为的集合classroom,它已经有记录。我想用名为timetable. 当我执行更新操作时,这会显示在控制台中{ ok: 0, n: 0, nModified: 0 }。并且文件没有更新。

课堂模式

var ClassroomSchema = new mongoose.Schema ({


    classroom_name: {
        type:String,
        required:true,
        unique: true,
    },

    classroom_blok:{
        type:String,
        required:true,
    },

    classroom_floor: {
        type:String,
        required:true,
    },



    timetable: 
    {
        timeslot: {
            required: true, 
            'type': String,
        },

        subject :{
            type: mongoose.Schema.Types.ObjectId,
            ref: 'Subject'
        },

        teacher :{
            type: mongoose.Schema.Types.ObjectId,
            ref: 'Teacher'   
        },

        day :{
            type:String, 
            required: true, 
        },

        year :{
            type:String, 
            required: true, 
        },

        session :{
            type:String,
            required:true,
        }
    }





});

更新操作

router.post('/timetable_morning', function (req, res, next) {
  if (
    req.body.teacher &&
    req.body.timeslot,
    req.body.subject,
    req.body.classroom,
    req.body.session,
    req.body.day) {

    var timetableData = {
      teacher: req.body.teacher,
      timeslot: req.body.timeslot,
      subject: req.body.subject,
      classroom:  req.body.classroom,
      year: currentYear,
      day: req.body.day,
      session: req.body.session
    }

    //use schema.create to insert data into the db
        var timetableData1 = {
          teacher: req.body.teacher,
          timeslot: req.body.timeslot,
          subject: req.body.subject,
          classroom:  req.body.classroom,
          year: currentYear,
          day: req.body.day,
          session: req.body.session
        }

        Classroom.updateOne({_id:req.body.classroom},timetableData1,function(err,classroom){
          if(!err){
            console.log(classroom);
            return res.redirect('/timetable');
          }
        });

  } else {
    var err = new Error('All fields have to be filled out');
    err.status = 400;
    return next(err);

  }

});

现有文件示例

{
    "_id" : ObjectId("5ee3943833325c210c9a7fee"),
    "classroom_name" : "6 Musytari",
    "classroom_blok" : "A",
    "classroom_floor" : "2",
    "__v" : 0
}

标签: node.jsmongodbmongoose

解决方案


你的处理函数可以是这样的

router.post('/timetable_morning/:classroom_id', function (req, res, next) {
let dataObj = {
    subject: req.body.subject,
    teacher: req.body.teacher,
    timeslot: req.body.timeslot,
    year: currentYear,
    day: req.body.day,
    session: req.body.session
}
db['Classroom'].updateOne({_id: req.params.classroom_id}, {timetable: dataObj}).then(data => {
    if (data.nModified !== 0) {
        console.log("updated successfully")
    } else {
        console.log("Something went wrong")
    }
}).catch(err => {
    console.log(err)
})})

笔记

请在此处记下字段classic_id应该是mongodb ObjectID,您将作为参数传递给您的路由处理程序函数

我还注意到您的有效负载在更新导致问题的文档时还有一个现场教室,因为您正在尝试更新时间表嵌入文档没有的值。


推荐阅读