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

使用whereArrayContains搜索的效率

傅峰
2023-03-14
问题内容

我对使用此代码在集合中搜索文档的效率感到好奇。随着集合中文档数量的增加和数组中项目的数量的增加,这种搜索会变得非常低效吗?是否有更好的方法可以执行此操作,或者可以对数据库进行模式更改以更好地优化此方法?在哪里可以找到Firestore文档的这些功能的时间复杂性?

Query query = db.collection("groups").whereArrayContains("members", userid);

我最初想尝试将组ID存储在该用户下,以便仅抓取该当前用户的组,但是遇到了问题,却从未找到使用多个ID进行查询来设置FireStoreRecyclerOptions的解决方案。

例:

for(String groupid : list) {
    Query query = db.collection("test-groups").document(groupid);

    FirestoreRecyclerOptions<GroupResponse> response = new FirestoreRecyclerOptions.Builder<GroupResponse>()
            .setQuery(query, GroupResponse.class)
            .build();
}

有没有一种方法可以向中添加多个查询FirestoreRecyclerOptions


问题答案:

随着集合中文档数量的增加和数组中项目的数量的增加,这种搜索会变得非常低效吗?

问题不是事实,即搜索将变得非常低效,而是文档有限制。因此,在文档中可以放入多少数据方面存在一些限制。根据有关使用和限制的官方文档:

文档的最大大小:1 MiB(1,048,576字节)

如您所见,单个文档中的数据总数限制为1 MiB。当我们谈论存储文本时,您可以存储很多,但是随着数组变大,请注意此限制。

如果要在数组中存储大量数据,并且这些数组应该由许多用户更新,则需要注意另一个限制。因此,每个文档每秒只能写入1次。因此,如果您遇到许多用户都试图一次将数据写入/更新到同一文档的情况,那么您可能会开始发现其中一些写入操作会失败。因此,也要注意此限制。

您可能已经注意到,Cloud Firestore中的查询非常快,这是因为Firestore会自动为您文档中的任何字段创建索引。

如果您认为要基于包含集合的特定成员的父项进行查询,请使用maps而不是arrays。

那里有很多帖子说数组在Cloud
Firestore上不能很好地工作,因为当您拥有可以被多个客户端更改的数据时,很容易感到困惑,因为您不知道正在发生什么以及在哪个字段上。如果我使用的是地图,并且用户想要编辑几个不同的字段,甚至是完全相同的字段,我们通常都知道发生了什么。在数组中,情况有所不同。试想一下,如果某个用户想要编辑索引0处的值,而另一些用户想要删除索引0处的值,您将得到截然不同的结果,为什么不这样做,数组越界例外。因此,带有数组的Firestore操作略有不同。因此,您无法在特定索引处执行诸如插入,更新或删除之类的操作。但是如果不
不必担心将元素存储到数组中的确切顺序,那么应该使用数组。Firestore几天前添加了一些功能来添加或删除特定元素,但前提是不关心它们的确切位置。看到这里是官方文档。

结论是,仅当需要将数据一起显示时,才将数据放在同一文档中。另外,不要使它们太大,以至于您需要下载更多实际需要的数据。因此,当您要搜索数据的各个字段或希望数据有增长空间时,请将数据收集起来。如果您要基于该数据搜索父对象,请将数据保留为地图字段。并且如果您获得了通常将其用作标志的项目,请继续使用数组。



 类似资料:
  • 问题内容: 我正在尝试为我的网站创建一个小型搜索。我曾尝试使用全文本索引搜索,但无法使用它。这是我想出的: 因此,基本上,它搜索数据库中所有条目的所有标题,正文和标记。这工作得很好,但是我只是想知道它的效率如何?这也只适用于小型博客。无论哪种方式,我都只是想知道是否可以提高效率。 问题答案: 无法提高查询效率。一旦获得大量数据,使用通配符查询将比使用全文本索引解决方案慢数百倍或数千倍。 您应该看一

  • 我一直在尝试使用Java的二分搜索方法在单词数组(一个词典)中搜索一个特定的字符串,然后确定该字符串是单词、前缀还是不是单词。如果返回的索引大于或等于零,则字符串为单词。如果返回的索引小于零,那么我必须确定它不是一个单词,还是一个前缀。

  • 我在处理一个单词搜索问题。我正确地实现了dfs搜索,但在其他地方有一些琐碎的错误。

  • 对于插入二叉查找树的时间效率, 我知道插入的最佳/平均情况是O(log n),其中最坏的情况是O(n)。 我想知道的是,除了实现AVL(平衡BST)之外,是否还有任何方法可以确保在插入时始终具有最佳/平均情况? 谢谢

  • 问题内容: 我在获取nHibernate.Search来创建索引时遇到了麻烦。 如果我使用nHibernate.dll和nHibernate.Search.dll的1.2.1.4,则可以正确创建索引,并且可以使用Luke(Lucene实用程序)对其进行检查。创建了一个segments文件以及一个Fragments文件等 但是,当我使用nHibernate.dll和nHibernate.Search

  • 问题内容: 我有很多小文本(说大约500个单词)和两个数据库,每个数据库大约有10.000个条目(关键字)。 现在,我想处理每个文本,并找出文本中包含哪些关键字(保存在2个数据库中的关键字)。 你们中的某人是否有有效地做到这一点的好方法? 我想对每个文本进行处理并对其进行索引(也许使用lucene),然后再针对它搜索数据库,但是我真的不知道lucene是否是正确的工具。 问题答案: Lucene正