如何在mongoose中保存子文档的数组?

时间:2015-10-25 08:20:38

标签: node.js mongoose

我见过很多例子,如何更新数组,就像这个一样 Mongoose find/update subdocument 还有这个 Partial update of a subdocument with nodejs/mongoose

但我的目标是更新特定字段,例如在用户输入数据的表单中。

我正在使用ejs进行模板化。

这是代码

为清楚起见,这是User's Schema

var UserSchema = mongoose.Schema({
   resume: {
     education: [{ type: String}],
   }

});

路由代码

router.post('/update-resume', function(req, res) {
    User.findById(req.user._id, function(err, foundUser) {

        // Take a look over here, how do I update an item in this array?
        if (req.body.education) foundUser.resume.education.push(req.body.education);

        foundUser.save(function(err) {
            if (err) return next(err);
            req.flash('message', 'Successfully update a resume');
            return res.redirect('/update-resume')
        });
    });

});

如果您查看上面的代码,我的目标是查询恢复的用户数据,并更新其当前值。

前端代码

<form role="form" method="post">
  <div class="form-group">
    <label for="education">Education:</label>
    <% for(var i = 0; i < user.resume.education.length; i++) { %>
    <input type="text" class="form-control" name="education" id="education" value="<%= user.resume.education[i] %>">
    <% } %>
  </div>
  <button type="submit" class="btn btn-primary">Submit</button>
</form>

前端代码确实有效,它在每个user.resume.education数组中迭代,并显示数组中的所有值。但是我如何更新呢?

1 个答案:

答案 0 :(得分:2)

由于您正在使用.push()教育数组,因此mongoose不知道此字段已更改,您需要使用markModified()函数指定它,因此mongoose会知道此字段已包含改变了,所以,在推送到教育阵列后使用:

foundUser.markModified('resume.education');

然后使用save()函数

<强>更新

router.post('/update-resume', function(req, res) {
    User.findById(req.user._id, function(err, foundUser) {

        // Take a look over here, how do I update an item in this array?
        if (req.body.education) foundUser.resume.education.push(req.body.education);

        foundUser.markModified('resume.education'); // <-- ADDITION

        foundUser.save(function(err) {
            if (err) return next(err);
            req.flash('message', 'Successfully update a resume');
            return res.redirect('/update-resume')
        });
    });

});