嵌套查询与mongoose

时间:2015-11-11 06:52:31

标签: node.js mongodb mongoose

我有三种模式:用户,发布和评论

var User = new Schema({
    name: String,
    email: String,
    password: String // obviously encrypted
});

var Post = new Schema({
    title: String,
    author: { type: Schema.ObjectId, ref: 'User' }
});

var Comment = new Schema({
    text: String,
    post: { type: Schema.ObjectId, ref: 'Post' },
    author: { type: Schema.ObjectId, ref: 'User' }
});

我需要获取用户评论的所有帖子

我知道它应该是一个非常简单和常见的用例,但是现在我无法找到一种方法来进行查询而无需多次调用并手动迭代结果。

我一直在考虑在comments架构中添加Post字段(我更愿意避免)并制作如下内容:

Post.find()
    .populate({ path: 'comments', match: { author: user } })
    .exec(function (err, posts) {
        console.log(posts);
    });

没有修改原始模式的任何线索?

由于

1 个答案:

答案 0 :(得分:0)

你基本上有几种解决方法。

1)不填充。这使用具有多个调用的promise。首先查询特定用户的parent.chidl3 = {} 模型,然后在返回的回调中使用评论中的帖子ID来获取帖子。您可以像这样使用 promises

Comment

2)使用填充。使用给定的userId查询特定用户的var promise = Comment.find({ "author": userId }).select("post").exec(); promise.then(function (comments) { var postIds = comments.map(function (c) { return c.post; }); return Post.find({ "_id": { "$in": postIds }).exec(); }).then(function (posts) { // do something with the posts here console.log(posts); }).then(null, function (err) { // handle error here }); 模型,只选择您想要的帖子字段并填充它:

Comment