如何填充mongoose模式

时间:2017-06-15 04:04:22

标签: node.js mongodb mongoose

我有以下mongoose架构

var postTable = mongoose.Schema({
userPost:{type : String},
dateCreated: {type: Date, default: Date.now},
_replies:[{type: mongoose.Schema.Types.ObjectId, ref: 'reply_table'}],
_creator:{type: mongoose.Schema.Types.ObjectId, ref: 'User'}
});

var reply_table = mongoose.Schema({
userReply:{type:String},
date_created:{type:Date, default: Date.now},
_post:{type: mongoose.Schema.Types.ObjectId, ref: 'post'},
_creator:{type: mongoose.Schema.Types.ObjectId, ref: 'User'}
});
var userPost = module.exports = mongoose.model("Post",postTable);

var userReply = module.exports = mongoose.model('reply_table',reply_table);

用户可以创建将在Post表中输入的帖子,其他用户可以评论或回复将被输入到reply_table的帖子。 然后我尝试像这样填充post表格

module.exports.getPost = function (callback) {
var mysort = { dateCreated: -1 };
userPost
    .find({},callback)
    .sort(mysort)
    .populate('_creator','username')
    .populate(' _replies')
    .exec(function (err,post) {
        if(err) throw err;
        console.log(post)
    });
  };

当控制台打印出帖子时,它会打印帖子信息和带有用户信息的对象,因为我为用户设置了另一个架构,因此我使用了.populate('_creator','username')

问题是它不打印回复信息它只打印一个空数组:回复[]。

我很确定我做的一切都是正确的。我使用以下代码将信息插入到reply_table

//make a reply on a post
module.exports.make_reply = function (user_id,pid,reply,callback) {
var newReply = userReply({
    _creator: user_id,
    _post: pid,
    userReply: reply
});
newReply.save(callback);
}

我知道这个问题很长,但是有人知道我可能做错了什么。我只想使用来自reply_table

的信息填充Post模式

1 个答案:

答案 0 :(得分:0)

我终于想出了我的问题的解决方案。我做的是我创建了一个函数来将回复id插入post表。它基本上通过其id获取注释,并将回复推送到post表中的_replies数组。

//Insert reply into post table
 module.exports.addReply = function (id,reply) {
 userPost.update({_id:id},{$push:{replies:reply}},{multi:true},function 
(err,post) {
});
}

当我使用getPost函数时,它会填充回复表

module.exports.getPost = function (callback) {
var mysort = {dateCreated: -1};
userPost
    .find({}, callback)
    .sort(mysort)
    .populate('_creator', 'username')
    .populate('replies')
    .exec(function (err) {
        if(err) throw err;
    });
   };