_id不应该在它应该生成的子文件时生成

时间:2014-03-10 21:56:45

标签: node.js mongodb mongoose

这是我的两个架构

var reviews = new Schema({
    scenarioId: { type: Schema.Types.ObjectId, required: true},
    authorId:  { type: Schema.Types.ObjectId , required:true },
    reviewNote:   String,
    subReviews: [subReviewSchema],
    active: {type: Boolean, default: true},
    display:  {type: Boolean, default: true},
    date : {type: Date, default: Date.now()}
});

和子视图的子程序

var subReviews = new Schema({
    authorId:  { type: Schema.Types.ObjectId, required:true },
    subReviewNote: String,
    date: {type: Date, default: Date.now()},
    active: {type: Boolean, default: true},
    display:  {type: Boolean, default: true}
});

这是我更新文档的代码

exports.addSubReview = function (req, res) {
    var id = req.params.id;
    var update = req.body;//scenario Id

    Review.findById(id, function (err, obj) {
        if (err || !obj) { return res.send(404, { error: err.message }); }

        obj.subReviews.push(update);

        obj.save(function (err) {
            if (err) { return res.send(404, { error: err.message }); }

            return res.send(200, obj);
        });
    });
};

出于某种原因,虽然每当我向这段代码发送一篇http帖子时,结果只会添加我在帖子请求中发送的内容而不是_id _v或我希望mongoose / mongodb添加为样板文件的任何其他内容。这是我的数据库中的示例文档

{
    "__v": 2,
    "_id": "531e3214a30f5f8427830a97",
    "authorId": "52fd0e6df8352c184b000004",
    "reviewNote": "aaaaaaaaaaaaaaaaa",
    "scenarioId": "531a5b80af15cffc051cea67",
    "date": "2014-03-10T21:37:05.230Z",
    "display": true,
    "active": true,
    "subReviews": [
        {
            "subReviewNote": "This is a subReview",
            "authorId": "52fd0e6df8352c184b000004"
        },
        {
            "subReviewNote": "This is a subReview",
            "authorId": "52fd0e6df8352c184b000004"
        }
    ]
} 

关于为什么_id没有被添加到subReviews中的subDocs的任何想法?。

1 个答案:

答案 0 :(得分:0)

我的猜测是问题出现在父文档中,你说:

  

subReviews:[subReviewSchema]

但您将子模式变量命名为

  

subReviews

不是subReviewSchema。但这是一个猜测,从你发布的内容。我必须一起看代码以获得更好的图片,除非是这样。

但是这可以解释它,因为subReviews:因为这个命名问题只是期待一个Object - 并且一个对象正是它在POST时获得的,所以它只是将它按预期推送到数组中。

修改

我在github的mongoose代码中探讨过,我对上面的答案不太自信,虽然我猜它仍然可能。但是,在声明模式时,我偶然发现了这个评论:

  
      
  • 在嵌套模式时,(上例中的children),在将子模式传递给父模式之前,始终先声明子模式。
  •   

我对原始答案的信心不足,因为看起来如果你错误地命名变量,mongoose会抛出一个TypeError