我是来自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,以便能够跟踪要更新的内容。
答案 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
来操纵它们