当前位置: 首页 > 面试题库 >

减少Firestore Android中的读取次数

诸嘉澍
2023-03-14
问题内容

我想减少阅读次数,以便从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)节省了大量数据重复

是的,它确实。



 类似资料:
  • 我们目前在Firebase上使用免费层,其中包含50k读取和20k写入操作配额。 每天大约有100名用户,我们的读取操作已经超过了配额。Firestore的结构如下所示: 该应用程序将显示按步骤数排序的用户列表。 因此,作为一个简单的计算,在每次应用程序启动时,如果等于集合中存储的用户条目数,则应读取代表读取操作的文档。对于打开应用程序的100个用户和100个用户条目,应该已经有10100次读取操

  • 我的applet已经可以读取存储在jar中的excel文件,但是要读取excel文件,我必须使用其他5个jar(DOM4J-2.0.0-alpha-2、POI-3.9-20121203、POI-OOXML-3.9-20121203、POI-OOXML-Schemas-3.9-20121203、xbean),总共10.1mb,不包括实际的applet jar(1.36mb)。这些需要一段时间来下载,

  • 我利用的功能如下: < li >将< code>MySQL表读入< code>DataFrame < li >改造他们 < li >合并它们 < li >写给< code>HDFS 在的整个生命周期中,没有对其执行s。它曾经像预期的那样工作,但最近我遇到了问题。由于的延迟求值,导致读取操作的并行性降低。 因此,如果我读取使用与,然后

  • 上下文:假设我有一个显示餐厅列表的应用程序 方法1:将所有餐厅添加到集合中,并将文档id保存在属于指定类别的数组中。所以,如果我想要所有的印度餐馆,我只需要获取包含所有印度餐馆Id的数组Indian,然后加载它们。 方法2:将所有餐厅添加到集合中,并为每个文档指定一个类别。因此,当用户需要印度餐馆列表时,我会使用where()将其过滤掉。在这种方法中,firestore是否会为所有100000次文

  • 我正在尝试对一个对象数组递归地运行一个reduce方法。 我从一个字符串开始,推送与该字符串匹配的对象,然后我看到条目。一旦我得到该对象,我就推送它,然后kepp递归地检查对象直到它达到最大(本例为3)。 但它不会超越第一个。 null null 期望的输出将是所有低于3并且在本例中管理的对象