我想减少阅读次数,以便从
QuestionCollection
(问题数组)中获取问题的详细信息。
我的应用程序就像stackoverflow的一部分一样工作。
我想说明一个问题有多少顶,观点和评论。因此,为了处理这个问题,我创建了多个集合,例如
问题集
评论集
问题喜欢
QuestionViews
问题标签
我认为CommentCollection(评论)仅属于一个问题。因此,我正在考虑将其合并为QuestionCollection
一个数组或一个集合(但这需要另一个读取命中)。哪个更好?
我想将两个变量(totalViews,totalLikes
)添加到QuestionCollection。但是每次我都必须检查该用户是否喜欢此问题或该用户是否查看过该问题。
给我一个建议或替代方案,这样我可以获得最少问题的机会。
编辑
为了显示视图计数,我迭代并计数QuestionViews集合,其中questionID == myQuestionID
为了显示喜欢计数,我迭代并计数QuestionLikes集合,其中questionID == myQuestionID
为什么不将其添加到QuestionCollection?因为我想显示观看次数最多和最喜欢的问题,例如stackoverflow。如果我将其添加到QuestionCollection中,我怎么能知道最喜欢和最受欢迎的问题。
我能想到的最有效的架构如下:
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)节省了大量数据重复
是的,它确实。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句