5

我正在使用 mongodb 和 mongoose 在 node.js 中构建一个 API。目前,我在嵌入文档(架构中的架构)中有一个嵌入文档,它根本没有保存到数据库中,我已经尽我所能但没有运气。

我在 mongoose 中将 Schema 定义为:

var BlogPostSchema = new Schema({
  creationTime: { type: Date, default: Date.now },
  author: { type: ObjectId, ref: "User" },
  title: { type: String },
  body: { type: String },
  comments: [CommentSchema]
});

var CommentSchema = new Schema({
  creationTime: { type: Date, default: Date.now },
  user: { type: ObjectId, ref: "User" },
  body: { type: String, default: "" },
  subComments: [SubCommentSchema]
});

var SubCommentSchema = new Schema({
  creationTime: { type: Date, default: Date.now },
  user: { type: ObjectId, ref: "User" },
  body: { type: String, default: "" }
});

我执行的代码如下:

// Create a comment
app.post("/posts/:id/comments", function(req, res, next) {
  Posts.find({ _id : req.params.id }, function(err, item){
    if(err) return next("Error finding blog post.");                
    item[0].comments.push(new Comment(JSON.parse(req.body)));
    item[0].save(); // <= This actually saves and works fine
    respond(req, res, item[0].comments, next);
  });
});

// Create a subcomment
app.post("/posts/:id/comments/:commentid/subcomments", function(req, res, next) {
  Posts.find({ _id : req.params.id }, function(err, item){
    if(err) return next("Error finding blog post.");
    item[0].comments[req.params.commentid - 1].subcomments.push(new SubComment(JSON.parse(req.body)));
    item[0].save(); // <= This completes (without error btw) but does not persist to the database
    respond(req, res, item[0].comments[req.params.commentid - 1].subcomments, next);
  });
});

我可以毫无问题地创建带有评论的博客文章,但由于某种原因,我无法在评论上创建子评论。博客文章文档实际上在执行期间打印到控制台时附加了评论和子评论 - 只是它不保存到数据库(它保存博客文章有评论,但没有子评论)。

我试图在评论数组上“markModified”,但没有改变:

Posts.markModified("comments"); // <= no error, but also no change
...
Posts.comments.markModified("subcomments"); // <= produces an error: "TypeError: Object [object Object] has no method 'markModified'"
4

2 回答 2

7

问题自解决。Aaron Heckmann 在mongoose Google Group上给了我答案:

始终在将子模式传递给父模式之前声明它们,否则您将传递未定义的。

SubCommentSchema 应该是第一个,然后是 Comment,然后是 BlogPost。

反转模式后,它起作用了。

于 2012-05-02T20:46:25.390 回答
1

我认为更新文档不是一个重要问题,因为嵌入式文档也完全能够提供任何服务。

于 2012-05-02T05:39:49.147 回答