如何更新Node.js和Mongoose

时间:2016-07-21 15:05:29

标签: node.js express mongoose

我是来自java体验的node.js的新手。我有一种情况,我试图包围我的头。我的堆栈是express.js,mongoose,ejs模板。这是我的场景: 我有一个架构:

var UserSchema = mongoose.Schema({
name: {
    type: String,
    index: true
},
password: {
    type: String,
    select: false
},
email: {
    type: String
},
academic: [{
    qualification: String,
    institute: String,
    from: String,
    to: String,
    about: String
}]

});

有一份学者名单。我想只更新该列表中的一个学术对象。我该怎么做?

router.post('/academic/schools/update', function (req, res) {

});

我将ejs模板中的值传递给路径并获取req.body中的值。如何在节点和mongoose中查询路由中的特定对象,然后更新其值。我想过可能会在学术对象中添加一个ID,以便能够跟踪要更新的内容。

1 个答案:

答案 0 :(得分:2)

保存后,每个学术子文档都会有一个_id。 有两种方法可以做到。如果您在网址或请求正文中传递了用户的ID和学术子博士ID的ID,那么您可以像这样更新:

User.findById(userId).then(user => {
    let academic = user.academic.id(academicId);
    academic.qualification = 'something';
    return user.save();
});

如果您只传递学术子博士的ID,那么您可以这样做:

User.findOne({'academic._id': academicId}).then(user => {
    let academic = user.academic.id(academicId);
    academic.qualification = 'something';
    return user.save();
});

请注意,从mongoose返回的子文档数组是mongoosearray而不是本机数组数据类型。所以你可以使用.id .push .pop .remove方法http://mongoosejs.com/docs/subdocs.html

来操纵它们