基于其他集合的 Mongoose 过滤元素
Mongoose filter elements based on other collection
我有三个合集:
User
有一些用户数据
id: ObjectId
Post
这是一个 post 一个 User
可以做的 - 它有一个对 User.id
的引用
id: ObjectId
author: {ref: 'User'}
text: String
datePosted: Date
User.reports
是 User.id
和 Post.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
集合中,并且总是 return 适量Posts
(在本例中为 10)?
我明白你现在的意思了。因此,基本上您希望在查找查询中使用 $nin 运算符来消除用户报告的 Post id 数组中的 id。
在您当前的架构中,这意味着 运行 两个查询,首先从您的报告集合中检索报告的 post 与用户匹配的 ID,然后 运行 查询如下:
Post.find( { _id: { $nin: arrayOfPostIds }}).....
如果您能够将报告放在用户模式中,那就更容易了,因为它可以节省查询,但我知道在某些情况下,最好也将它们放在自己的集合中。
我有三个合集:
User
有一些用户数据id: ObjectId
的引用Post
这是一个 post 一个User
可以做的 - 它有一个对User.id
id: ObjectId author: {ref: 'User'} text: String datePosted: Date
User.reports
是User.id
和Post.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
集合中,并且总是 return 适量Posts
(在本例中为 10)?
我明白你现在的意思了。因此,基本上您希望在查找查询中使用 $nin 运算符来消除用户报告的 Post id 数组中的 id。
在您当前的架构中,这意味着 运行 两个查询,首先从您的报告集合中检索报告的 post 与用户匹配的 ID,然后 运行 查询如下:
Post.find( { _id: { $nin: arrayOfPostIds }}).....
如果您能够将报告放在用户模式中,那就更容易了,因为它可以节省查询,但我知道在某些情况下,最好也将它们放在自己的集合中。