我能想到的最有效的架构如下:
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)节省了大量数据重复
是的,它确实。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)