【问题标题】:Mongoose filter elements based on other collection基于其他集合的猫鼬过滤元素
【发布时间】:2018-07-18 22:35:38
【问题描述】:

我有三个系列:

  1. User 有一些用户数据

    id: ObjectId

  2. Post 这是User 可以发布的帖子 - 它有一个对User.id 的引用

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

  3. User.reportsUser.idPost.id 之间的关联,此集合中的文档意味着User 报告了Post

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

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);

我的问题是:如何跳过User 报告的Posts - 它们在User.reports 集合中,并且始终返回正确数量的Posts(在本例中为10)?

【问题讨论】:

  • 看到你的帖子和用户模式会有很大帮助
  • 我已经更新了架构

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


【解决方案1】:

我明白你现在的意思了。因此,基本上您希望在 find 查询中使用 $nin 运算符来消除用户报告的 Post id 数组中的 id。

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

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

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

【讨论】:

  • 好的,所以只有一个查询(保持给定的模式)没有办法做到这一点?这个“getPosts”API 会受到很多影响,所以我认为避免 2 次调用(如果可能的话)对于这个特定的函数调用会很好
  • 在概念上,您可以使用聚合框架一次性完成更复杂的查询。但是,我无法找到一种方法来使用像 $nin 这样的东西作为聚合查询的一部分。根据我的经验,在您的情况下,将信息嵌入到 User 或 Post 架构而不是(或附加到)另一个集合中通常会更好。
猜你喜欢
  • 2021-01-18
  • 1970-01-01
  • 2019-01-12
  • 2017-07-26
  • 2016-02-25
  • 2019-09-04
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多