Mongoose查询填充查找元素的匹配ID

时间:2015-02-10 17:34:29

标签: node.js mongodb mongoose

我尝试使用其他模型的数据填充模型。这两个模型看起来像这样:

var postSchema = mongoose.Schema({
    _comments: { type: mongoose.Schema.Types.ObjectId, ref: 'Comment' },
    type: String,
    body: String,
});

var commentSchema = mongoose.Schema({
    id_post: mongoose.Schema.Types.ObjectId,
    body: String,
});

我想找到所有posts,并使用comments来自已创建的帖子id_post == _id填充Post.find({}).populate({ path: '_comments', select: 'body', match: { post_id: Post._id } options: { limit: 5 } }) .exec(function (err, posts){...}); 。像这样:

{{1}}

1 个答案:

答案 0 :(得分:4)

首先,您编写的代码中几乎没有问题。 如果每个帖子可能有很多注释你应该在你的模式之间实现一对多的关系,你可以通过用[]

包围注释ref来做到这一点。
var postSchema = mongoose.Schema({
    _comments:  [ {type: mongoose.Schema.Types.ObjectId, ref: 'Comment'} ] ,
    type: String,
    body: String,
});

id_post不仅仅是ObjectId类型的字段,它应该像这样写:

var commentSchema = mongoose.Schema({
post: { type: mongoose.Schema.Types.ObjectId, ref: 'Post' },
body: String,
});

保存新评论时,请确保将其连接到帖子:

var comment = new Comment({
    body: "Hello",
    post: post._id    // assign the _id from the post
  }); 

comment.save(function (err) {
    if (err) return handleError(err);
    // thats it!
  });

现在,当您想要查找帖子并填充其评论时,您应该写下这样的内容:

Post
.find(...)
.populate({
  path: '_comments',
  select: 'body',
  options: { limit: 5 }
})
.exec()

我放弃匹配的原因是,当您想根据特定字段进行过滤时应使用匹配,在您的情况下,您可以使用匹配来仅获取type ='something'的注释。

populate应该有效,因为当您插入注释时,您将其绑定到其帖子。

有关正确使用populate方式的更多信息,请访问此处 - Mongoose Query Population

发布数据应按以下方式保留:

{
   body: "some body",
   type: "some type",
   _comments: [12346789, 234567890, ...]
}

有关裁判将在此处保留的方式的更多信息 - One-to-Many Relationships with Document References