如何根据其ID更新嵌入式文档?

时间:2014-06-25 01:59:43

标签: node.js mongodb mongoose

我有一个需要更新的嵌入式文档。我无法弄清楚如何更新给定id的文档。这是我到目前为止所做的,但它不起作用:

var Post = require('../models/post');
var comment_id = 5394f5be2f6953083908db47;
var updateData = {
    comment: req.body.comment,
    title: req.body.title
};

Post.update({ comments : { _id : comment_id } }, updateData, function(err,data) {
    return res.json({success: true});
});

var postCommentSchema = mongoose.Schema({
    title : String,
    comment : String,
    user : String,
    tags : [],
    created : {
        type: Date,
        default: Date.now
    }
});

var postSchema = mongoose.Schema({
    post : String,
    title : String,
    created : {
        type: Date,
        default: Date.now
    },
    comments : [postCommentSchema]
});

module.exports = mongoose.model('Posts', postSchema);

1 个答案:

答案 0 :(得分:1)

您的“comment_id”变量需要引用为有效的JavaScript。但基本上这是一个单数_id值,不能出现多次,你可以使用“点符号”来解决所需的字段。然后,您需要一个positional $运算符来引用您在更新端匹配的字段的索引。

此外,您需要$set运算符,否则您的“updateData”对象将覆盖您引用的数组成员中的现有数据,即此处缺少的日期:

var comment_id = "5394f5be2f6953083908db47";

Post.update(
    { "comments._id" : comment_id } }, 
    { "$set": { 
        "comments.$.comment": req.body.comments,
        "comments.$.title": req.body.title
    } }, 
    function(err,numAffected) {
       return res.json({success: true});
    }
);

虽然你没有在这里使用它,但.update()回调的第二个参数是受语句影响的文档数,而不是实际的文档或数据。要将文档作为结果返回,请查看mongoose API文档中的.findOneAndUpdate()等方法。

.update()的官方MongoDB文档也显示了几种常见用例。