Mongoose,添加和读回嵌套文档

时间:2014-03-09 13:50:17

标签: node.js mongoose

好的,这让我疯了。它应该很简单......我希望。我只想在数组中重用模型,比如递归模型定义。

这是我的模特

var mongoose = require("mongoose");
var Schema = mongoose.Schema;

var Post = mongoose.model("Post", {
    username : String,
    message : String,
    replies : [{
        type : Schema.Types.ObjectId,
        ref : 'Post'
    }]
});

module.exports.Post = Post;

我创建了帖子。这是我试图添加回复的方式:

module.exports.addReply = function (id, username, message, callback) {

  var reply = new Post();
  reply.username = username;
  reply.message = message;

  Post.update(
    { _id: id },
    { $push: { replies : reply }},
    { safe: true, upsert : true},
    function (err, result) {
      if(err){
        callback(createError("Error updating post with reply"));
        return;
      }
      callback(createSuccess(reply));
    });
};

但是当我收到帖子(并且它的回复)时,回复数组是空的。这是我的getPost方法......

var getPostById = function (id, callback) {
  Post
    .findOne({ _id: id })
    .populate("replies")
    .exec(function (err, post) {
      if (err) {
        callback(createError("Post '" + id + "' not found.\n" + err));
        return;
      }

      callback(createSuccess(post));
      return;
    });
};
module.exports.getPostById = getPostById;

我在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

我认为您需要在推送之前保存reply。记住ref只是维护一个对回复的引用(带有id字段,就像在sql中一样)。未保存时,没有对象ID可以推送到回复数组。

var reply = new Post();
reply.username = username;
reply.message = message;
reply.save(function(err, savedReply) {
    /// Post.update(...
});