猫鼬:如何过滤对象内部的对象数组

时间:2020-04-01 14:42:55

标签: node.js mongoose

我有一个帖子列表,每个帖子包含一组评论,每个评论可能是私人的,也可能是公共的,我想向管理员显示所有私人和公共的评论,但是普通用户我只想向他们显示公共评论。

这是发布和评论模式的一部分:

const PostSchema = new mongoose.Schema({
 title: String,
 comments: [{ type: Schema.Types.ObjectId, ref: 'Comment' }]
})

const CommentSchema = new mongoose.Schema({
 body: String,
 type: { type: String, enum: ['public', 'private'] }
})

这是我随附的解决方案: 按ID抓取帖子:

const post= await Post.findById(id);

然后过滤:

post.comments = post.comments.filter(c => c.type != "private");
return res.json(post)

但如果可能的话,我想用全猫鼬做它。

1 个答案:

答案 0 :(得分:2)

更新您的评论架构:

const CommentSchema = new mongoose.Schema({
    body: String,
    public: Boolean,
    post: { type: Schema.Types.ObjectId, ref: 'Post' }
})

您可以使用猫鼬的populate()方法提取特定帖子下的评论。 match属性是您输入查询的地方。

Post.findById(id)
    .populate({ path: 'comments', match: { 'type': 'public' } })
    .exec((err, postWithFilteredComments) => {
        res.json({ postWithFilteredComments })
    })