出于学习目的,我的目标是使用Firestore创建一个Twitter克隆。
首先,我认为我需要两个集合:users
和tweets
。我想通过所有users
提供所有推文的一个主要供稿,这很容易做到:
db.collection('tweets').get()
.then(querySnapshot => {
querySnapshot.forEach(tweet => {
console.log(`${tweet.data()}`);
})
})
如果我希望能够查询特定用户的推文列表(在查看该用户的个人资料时)?
据我了解,我有3种选择,但是我不确定每种方法的优点和缺点:
选项1 :创建将保存推文的用户子集合:
db.collection('users').doc('username_123').collection('tweets').get()
选项2 :创建一个具有适当名称的根级别集合,该集合将显示数据的层次结构:
var username = 'username_123';
db.collections('tweets__' + username).get()
选项3 :使用相等运算符查询:
var username = 'username_456';
db.collection('tweets').where("username", "==", username).get()
我想选择一种在规模上具有成本效益的方法。
答案 0 :(得分:0)
这是一个很好的问题,我一直在自己进行调查。我看到两个选项,并且更喜欢选项1。
选项1:用于快速读取用户供稿,价格适中
每个新帖子都写在一个称为post_user的顶级集合中,并赋予一个唯一的标识符postID_userID
。文档中的字段为:
然后,根据原始发布者的每个关注者将每个帖子重写多次,将userID替换为该特定关注者的ID,并将original设置为false。
用户打开应用程序时,仅需要一个Firestore查询:
Firestore查询速度与结果集成正比,而不与整个数据集成正比,因此这是一个非常快速的查询。
该应用会组合这些数据,并通过无限滚动条将其呈现给用户。由于不需要合并数据,因此可以很快完成。
当用户滚动到结果的末尾时,将在接下来的20天里重复上述查询并加载价值(如Facebook的无限滚动条)。
每个新帖子(将这些帖子添加到所有关注者)的写入次数可能会导致客户端体验缓慢。因此,也许客户仅创建用户帖子,但是一旦创建并获得用户确认,便运行 Cloud Function 将该帖子发布到所有关注者提要。客户端应用程序不会等待所有这些操作,因此它会很快,并且追随者会在一分钟左右的时间内看到新帖子。 CRON工作也许也可以用于此目的,但是我不确定这是否可以节省成本。
选项2:读取用户供稿的速度较慢,费用较低
每个新帖子仅在称为posts的顶级集合中写入一次,并且具有postID的唯一标识符。文档中的字段为:
当用户打开应用程序时,Firestore查询数量众多,花费的时间更长(并且关注的人越多,时间就越长):
然后在客户端 上将这些结果合并。根据用户关注的人数,这可能需要一段时间。然后,该应用将在无限滚动条中向用户显示帖子。
当用户滚动到结果的末尾时,必须在接下来的20天之内重复上述所有查询和结果合并。
答案 1 :(得分:0)
我认为如果您在选项 1 中提到的用户集合中选择推文的子集合会更好
因为查询每个用户的推文很容易
查询所有推文,您可以使用 Firestore collection group query