如何将对象添加到作为对象内键值的数组中?

时间:2020-08-14 05:35:17

标签: node.js mongodb express mongoose

我有一个这样的用户模型:

const userSchema = new mongoose.Schema({
    name: {
        type: String,
        required: true
    },
    courses: {
        type: Object,
        required: true
    }
})

还有这样的课程模型:

const courseSchema = new mongoose.Schema({
    course_code: {
        type: String,
        required: true
    },
    course_title: {
        type: String,
        required: true
    }
})

app.js文件在这里:

app.post('/enroll/:id', async function (req, res) {
    const courseWithID = await Course.findById(req.params.id)
    const course = {"course_code": courseWithID.course_code, "course_title": courseWithID.course_title}
    const userID = req.user.id
    
    await User.findByIdAndUpdate(userID, {"courses": course}, {new: true, runValidators: true, useFindAndModify: false})
    res.redirect('/dashboard')
})

第一次执行app.js之后,我得到以下结果:

    {
        "name": "Person",
        "courses": {
            "course_code": "123",
            "course_title": "ABC"
        }
    }

第二次执行app.js之后,我得到以下结果:

    {
        "name": "Person",
        "courses": {
            "course_code": "456",
            "course_title": "DEF"
        }
    }

但是在第二次执行app.js之后,我想要这个结果:

{
    "name": "Person",
    "courses": [
        {
            "course_code": "123",
            "course_title": "ABC"
        },
        {
            "course_code": "456",
            "course_title": "DEF"
        }
    ]
}

我该怎么做?

1 个答案:

答案 0 :(得分:0)

快速修复,

  • courses类型Object更改为Array
const userSchema = new mongoose.Schema({
    name: {
        type: String,
        required: true
    },
    courses: {
        type: Array,
        required: true
    }
})
const courseWithID = await Course.findById(req.params.id);
const course = {
  "course_code": courseWithID.course_code, 
  "course_title": courseWithID.course_title
};
const userID = req.user.id;

await User.findByIdAndUpdate(userID, 
  {
    "$push": { "courses": course }
  }, 
  {new: true, runValidators: true, useFindAndModify: false}
)