减少Firestore Android中的读取次数

AndroidGeek:

我想减少阅读次数,以便从QuestionCollection(问题数组)中获取问题的详细信息

我的应用程序就像stackoverflow的一部分一样工作

我想说明一个问题有多少顶,观点和评论因此,为了处理这个问题,我创建了多个集合,例如

问题集

  • ID
  • 标题
  • 创建日期

评论集

  • ID
  • 评论
  • 创建日期

问题喜欢

  • QuestionID
  • 用户身份

QuestionViews

  • QuestionID
  • 用户身份

问题标签

  • QuestionID
  • 标签ID

我认为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"

其中commentslikesviewsquestionId文档中的标题与在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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章