>我有一个posts
集合,我的应用程序在其中存储用户的所有帖子,数据结构如下:
+ uid (the user id of the creator)
+ text-content : String
+ tagged-users: [String]
+ assigned-media: [{"downloadUrl": String, "storageLocation": String}]
+ type: String
+ typestamp: Timestamp
+ Likes
+ uid (the user id of the liking person)
+ timestamp: Timestamp
+ postId (optional, depending on the results of the collection group queries)
现在,我想向我的用户显示此集合的所有帖子;但前提是用户关注创建帖子的人,即帖子文档的uid
字段适合。
我知道如果用户只关注一个人,查询集合很简单,即我有一个简单的where
子句。但是:如果我的用户关注 10.000人或更多人怎么办?如何查询?
另外,我应该如何存储followings
,即用户关注的人?使用一个简单的数组似乎不适合我,但是对于所有其他选项,我无法在帖子集合中查询来自我关注的人的帖子。
我将不胜感激我能得到的每一个帮助!
这是一个复杂的问题(我不是 100% 确定这是要求它的正确地方(,我会尽我所能来一些东西来帮助你开始,
免责声明,这可能适用于您的用例,也可能不适用于
将服务分为 3 个集合: -用户 -追随 者 -职位
用户集合非常简单,您只需要文档 ID(您已经拥有它(。
{
"andyIsTheBest": {
uid: `andyIsTheBest`
// ...
},
"sophieTheBest": {
uid: `sophieTheBest`,
// ...
},
"andyTheWorst": {
uid: `andyTheWorst`,
// ...
},
}
关注者镜像用户的文档 ID,它应该看起来像这样:
{
"andyIsTheBest": {
last_post: 2019,
followers: [
'sophieTheBest', 'andyTheWorst'
],
recent: [
{
post_id: 112233, // from the post collection
seq: 2019
}
]
}
}
最后,帖子集合如下所示:
{
"112233": {
seq: 2019,
body: `blabla the cool post`
author: `andyIsTheBest`
}
}
重要提示,请注意序列seq
编号也是last_post
,您可以通过云函数更新此值以便跟踪它,然后其余的只是实现详细信息:
const remove = firebase.firestore.FieldValue.arrayRemove
const union = firebase.firestore.FieldValue.arrayUnion
const follow = async (toFollow, user) => {
await db
.collection('followers')
.doc(toFollow)
.update({ users: union(user) });
}
const unfollow = async (toUnFollow, user) => {
await db
.collection('followers')
.doc(toUnFollow);
.update({ users: remove(user) });
}
const feed = async (user) => {
await db.collection(`followers`)
.where(`followers`, `array-contains`, user)
.orderBy(`last_post`, `desc`)
.limit(10)
.get()
// do whatever business logic you need down here
}
基本上这样,无论你有 1 万亿还是 1 万亿,查询都应该没问题。
有很多细节我没有介绍,但这应该可以让你开始。
希望这有帮助。
感谢在我的公司实施此服务的同事^^