为简化起见,假设应用程序只有两个实体:user
和post
,它们是用户创建的内容。
用户可以做三件事:
我的问题是:如何根据作者是否不跟随我来查询posts
?
users/{userId}
- userId
posts/{postId}
- author <userId>
- content
unfollows/{userId}
- userId
- unfollowedUserId
likes/{postId_userId}
- postId
- userId
dislikes/{postId_userId}
- postId
- userId
查询帖子
// get all userIds that I unfollow
const unfollows = collection('unfollows').where('userId', '==', 'myUserId');
但是我不知道如何使用posts
来查询unfollows
,// This doesn't seem correct and
// I don't know how to write the `where` filters programmatically:
// assume unfollows is already sorted.
const unfollows = collection('posts')
.where('author', '<', unfollows[0]).where('author', '>', unfollows[0])
.where('author', '<', unfollows[1]).where('author', '>', unfollows[1])
...
是一个有效的用户ID数组。
unfollowedBy
在posts
中添加post
字段,该字段是用户跟随作者并在unfollows
创建时填充并在新users/{userId}
- userId
posts/{postId}
- author <userId>
- content
- unfollowedBy <Map with userIds as keys>
unfollows/{userId}
- userId
- unfollowedUserId
likes/{postId_userId}
- postId
- userId
dislikes/{postId_userId}
- postId
- userId
进行更新的用户的地图。
posts
这使我可以使用以下查询collection('posts').where(`unfollowedUserId.${myUserId}`, '==', null);
:
unfollowedBy
但是,这种方法存在一些问题:
post
文档中的unfollowedBy
无法缩放,因为unfollowedBy
的大小与用户群的大小成正比。我知道对于任何要增长到无限制大小的东西,都应该是子集合,而不是文档中的地图,但是通过将posts
成为子集合,我无法再用它查询post
。unfollowedBy
文档将经常更新,以使unfollowedBy
地图保持最新。