Mongoose过滤元素基于其他集合

时间:2018-02-08 11:10:59

标签: node.js mongodb mongoose mongoose-schema mongoose-populate

我有三个系列:

  1. User,其中包含一些用户数据

    id: ObjectId

  2. Post这是User可以发布的帖子 - 它的引用为User.id

    id: ObjectId author: {ref: 'User'} text: String datePosted: Date

  3. User.reports这是User.idPost.id之间的关联,此集合中的文档表示User已报告Post

    id: ObjectId user: {ref: 'User'} post: {ref: 'Post'} dateReported: Date

  4. Posts可能是巨大的(数千),所以当我检索它们时,我会做一些无限滚动 - 获得最新的10个,然后是接下来的10个......等等。

    这是我的疑问:

            let posts = await Post.find()
            .skip(start) //0 initial
            .limit(step) //step is 10
            .populate('author')
            .sort('-datePosted')
            .exec();
    
        return res.json(posts);
    

    我的问题是:如何跳过Posts所报告的User - User.reports集合中的Posts,并始终返回正确数量的<div class="row w-100"> Your Elements </div> (在这种情况下10)?

1 个答案:

答案 0 :(得分:0)

我知道你现在得到了什么。因此,基本上您希望在查询查询中使用$ nin运算符来消除用户报告的Post ID数组中的ID。

在当前架构中,这意味着运行两个查询,首先从与用户匹配的报表集合中检索报告的帖子ID,然后运行如下查询:

   Post.find( { _id: { $nin: arrayOfPostIds }}).....

如果您能够将报告放在用户架构中,那么它会更容易,因为它会保存查询,但我知道有些情况下最好将它们放在自己的集合中。