减少在Firestore Android中的读取次数

时间:2018-08-27 11:36:56

标签: java android firebase google-cloud-firestore

  

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

我的应用就像堆栈溢出的一部分

我想显示一个问题有多少个赞,视图和评论。因此,为了处理此问题,我创建了多个类似

的集合

QuestionCollection

  • ID
  • 标题
  • DateCreated

评论集合

  • ID
  • 评论
  • DateCreated

问题喜好

  • QuestionID
  • 用户ID

QuestionViews

  • QuestionID
  • 用户ID

QuestionTAG

  • QuestionID
  • TagID

我认为 CommentCollection (评论)仅属于一个问题。因此,我正在考虑像数组或集合那样将QuestionCollection并入(但这需要另一个读取命中项)。 哪个更好

我想将两个变量(totalViews,totalLikes)添加到QuestionCollection。但是每次我都必须检查该用户是否喜欢这个问题或该用户是否查看过。

给我一​​个建议或其他选择,这样我就可以最少地获取问题的详细信息

修改

用于显示观看次数     我迭代并计数 QuestionViews集合,其中questionID == myQuestionID

用于显示喜欢计数     我迭代并计数 QuestionLikes集合,其中questionID == myQuestionID

为什么不将其添加到QuestionCollection?因为我想显示观看次数最多和最喜欢的问题,例如stackoverflow。如果我将其添加到QuestionCollection中,我怎么能知道最喜欢和最常查看的问题。

1 个答案:

答案 0 :(得分:3)

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

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

FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
DocumentReference questionIdRef = rootRef.collection("questions").document(questionId);
questionIdRef.get().addOnCompleteListener(/* ... */);

由于单个问题可能有成百上千,甚至数千个甚至更多的评论,喜欢和观点,因此将数据存储到数组中将无济于事。根据{{​​3}}:

  

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")也会返回 ArrayList 而不是{ {1}}。

如果您还想计算收藏集中的点赞次数或任何其他数量的文档,请从此 official documentation 中查看我的答案。

编辑:

根据您的评论:

  

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

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

array

根据 post ,您还可以将点赞次数存储在Firebase实时数据库中,还可以使用 this

  

第二,如果我想显示所有与标签(例如数学)相关的问题(显示所有具有数学标签的问题)?

如上所述,您可以利用Query query = rootRef.collection("questions").orderBy("numberOfLikes", Query.Direction.DESCENDING); 方法。您还可以将标签存储为字符串而不是ID。为此,您需要更改此结构:

whereArrayContains

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

代码应如下所示:

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

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

是的。