Node.js 如何根据嵌入文档的id更新该文档?

Node.js 如何根据嵌入文档的id更新该文档?,node.js,mongodb,mongoose,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 :

我有一个需要更新的嵌入式文档。我在考虑如何更新给定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);
您的“comment_id”变量需要被引用才能成为有效的JavaScript。但基本上,这是一个单数的
\u id
值,不能出现多次,因此可以使用“点符号”来处理所需字段。然后需要一个操作符来引用在更新端匹配的字段的索引

此外,还需要运算符,否则“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});
    }
);
虽然您没有在这里使用它,但的回调的第二个参数是受语句影响的文档数,而不是实际的文档或数据。要将文档取回,请查看MongooseAPI文档中的方法


此外,的官方MongoDB文档还显示了几种常见的使用案例。

感谢您的帮助,但仍然存在一些问题。您建议使用
$set
,这样我的现有数据就不会被覆盖。但是,按照现在的方式,当我尝试更新时,未包含在
updateData
对象中的所有字段都将从文档中删除。如何修改您的代码,使现有的“字段”不会被删除?@ChrisPaterson您是对的。我忙着指出我忘了纠正的其他部分。答案变了。基本上也是使用位置运算符的“点表示法”。