gpt4 book ai didi

java - 使用 whereArrayContains 搜索的效率

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:43:36 28 4
gpt4 key购买 nike

我很好奇使用这段代码在集合中搜索文档的效率。随着集合中文档数量的增长和数组中项目数量的增长,这种搜索会变得非常低效吗?有没有更好的方法可以做到这一点,或者我可以对数据库进行架构更改以更好地优化它?有没有什么地方可以为 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 添加多个查询?

最佳答案

As the number of documents in the collection grows and the number of items in the array grows will this search become very inefficient?

问题不在于搜索将变得非常低效,问题在于文档有限制。因此,对于可以放入文档的数据量存在一些限制。根据有关 usage and limits 的官方文档:

Maximum size for a document: 1 MiB (1,048,576 bytes)

如您所见,单个文档中的数据总量不得超过 1 MiB。当我们谈论存储文本时,您可以存储相当多的内容,但随着数组变大,请注意此限制。

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

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

如果您认为您将根据父项包含集合的特定成员来查询父项,那么请使用映射而不是数组。

那里有很多帖子说数组在 Cloud Firestore 上不能很好地工作,因为当您拥有可以由多个客户端更改的数据时,很容易混淆,因为您不知道发生了什么以及发生在哪个字段上.如果我正在使用 map 并且用户想要编辑几个不同的字段,甚至是完全相同的字段,我们通常都知道发生了什么。在数组中,情况有所不同。试着想一想如果一个用户想要编辑索引 0 处的值可能会发生什么,其他用户想要删除索引 0 处的值你最终会得到非常不同的结果,为什么不,数组越界异常。所以 Firestore 对数组的操作有点不同。因此,您不能在特定索引处执行插入、更新或删除等操作。但是如果不关心将元素存储到数组中的确切顺序,那么您应该使用数组。 Firestore 几天前添加了一些功能来添加或删除特定元素,但前提是不关心它们的确切位置。参见 here官方文档。

总而言之,只有在需要一起显示时才将数据放在同一个文档中。另外,不要让它们太大,这样您将需要下载比实际需要更多的数据。当您想要搜索该数据的各个字段或者如果您希望您的数据有增长空间时,将数据放入集合中。如果您想根据该数据搜索您的父对象,请将您的数据保留为 map 字段。如果您有通常用作标志的项目,请继续使用数组。

另外,不用担心 slow query在 Firestore 中。

关于java - 使用 whereArrayContains 搜索的效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52469492/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com