【问题标题】:How to update a specific object in a array of objects in Node.js and Mongoose如何更新 Node.js 和 Mongoose 中的对象数组中的特定对象
【发布时间】:2016-07-22 22:47:37
【问题描述】:

我是来自 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 中的值。我将如何在节点和猫鼬中查询路由中的特定对象,然后更新其值。我考虑过向学术对象添加一个 ID,以便能够跟踪要更新的对象。

【问题讨论】:

  • Mongoose 应该自动为 Academics 数组中的每个对象添加一个 _id 字段,因为它将它们视为“子文档”。您可以使用 { 'academics._id': _id } 等在 Academics 数组中查询,然后您可以使用位置运算符 { $set: { 'academics.$' : yourUpdatedAcademic } } 更新匹配的文档 ... 更多信息docs.mongodb.com/manual/reference/operator/update/positional

标签: node.js express mongoose


【解决方案1】:

保存后,每个学术子文档都会有一个_id。 有两种方法可以做到。如果您在 url 或请求正文中传递用户的 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

来操作它们

【讨论】:

    猜你喜欢
    • 2018-03-04
    • 1970-01-01
    • 1970-01-01
    • 2018-12-16
    • 1970-01-01
    • 2013-03-19
    • 1970-01-01
    • 2020-10-27
    相关资源
    最近更新 更多