减少Firestore Android中的读取次数

减少Firestore Android中的读取次数,第1张

减少Firestore Android中的读取次数

我能想到的最有效的架构如下:

Firestore-root    |    --- questions (collections)    |     |    |     --- questionId (document)    | |    | --- questionId: "02cubnmO1wqyz6yKg571"    | |    | --- title: "Question Title"    | |    | --- date: August 27, 2018 at 6:16:58 PM UTC+3    | |    | --- comments (colletion)    | |     |    | |     --- commentId    | | |    | | ---commentId: "5aoCfqt2w8N8jtQ53R8f"    | | |    | | ---comment: "My Comment"    | | |    | | ---date: August 27, 2018 at 6:18:28 PM UTC+3    | |    | --- likes (colletion)    | |     |    | |     --- likeId (document)    | | |    | | --- userId: true    | |    | --- views (colletion)    | |     |    | |     --- viewId (document)    | | |    | | --- userId: true    | |    | --- tags ["tagId", "tagId"]    |    --- tags (collections)          |          --- tagId (document)     |     --- tagId: "yR8iLzdBdylFkSzg1k4K"     |     --- tagName: "Tag Name"

其中

comments
likes
views
questionId
文档中的标题。与在Firebase实时数据库中显示问题列表不同,在Firebase实时数据库中,您已经下载了整个问题对象,而在Cloud
Firestore中,这不再是问题。因此,为避免使用
where
方法进行查询,您可以简单地得到一个特定的问题,如下所示:

FirebaseFirestore rootRef = FirebaseFirestore.getInstance();documentReference questionIdRef = rootRef.collection("questions").document(questionId);questionIdRef.get().addonCompleteListener();

由于您可能对单个问题有成百上千,甚至成千上万的评论,喜欢和观点,因此将数据存储到数组中将无济于事。根据官方文件:

Cloud Firestore经过优化,可存储大量小文件。

例如,要获取特定问题的所有注释,可以使用以下查询:

Query query = rootRef.collection("questions/"+questionId+"comments").orderBy("date", Query.Direction.DESCENDING);

因为一个问题只能有几个标签,所以您可以简单地使用数组。要获取带有特定标签的所有问题,可以使用以下查询:

Query query = rootRef.collection("questions/"+questionId+"tags").whereArrayContains("tags", tagId);

需要记住的另一件事,即使

tags
对象以数组形式存储在数据库中,
document.get("tags")
也将返回an
ArrayList

而不是an
array

如果您还想计算收藏集中的点赞次数或其他任何数量的文档,请参阅此
帖子中 我的回答。

编辑:

根据您的评论:

如果我想向用户显示最喜欢的问题。我该怎么办?

您应该在问题对象内添加喜欢的数目作为属性,然后可以根据如下查询数据库:

Query query = rootRef.collection("questions").orderBy("numberOfLikes", Query.Direction.DESCENDING);

根据 这个 ,你还可以存储喜欢在火力地堡实时数据库的数量,可以增加/减少使用它
火力地堡交易

其次,如果我想显示所有与诸如数学之类的标签相关的问题(显示所有具有数学标签的问题)?

如上所述,您可以利用该

whereArrayContains
方法的优势。您还可以将标签存储为字符串而不是ID。为此,您需要更改此结构:

--- tags ["tagId", "tagId"]

--- tags ["mathematics", "chemistry"]

并且代码应如下所示:

Query query = rootRef.collection("questions/"+questionId+"tags").whereArrayContains("tags", "mathematics");

语句(userId:true)节省了大量数据重复

是的,它确实。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5490229.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-12
下一篇 2022-12-12

发表评论

登录后才能评论

评论列表(0条)

保存