当前位置: 代码迷 >> Android >> 使用whereArrayContains进行搜索的效率 替代解决方案
  详细解决方案

使用whereArrayContains进行搜索的效率 替代解决方案

热度:135   发布时间:2023-08-04 12:51:54.0

我很好奇使用此代码搜索集合中的文档的效率。 随着集合中文档数量的增加以及数组中项目数量的增长,这种搜索效率会非常低下吗? 有没有更好的方法来实现这一点,或者我是否可以对数据库进行架构更改以更好地优化这一点? 有什么地方我可以找到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会自动为文档中的任何字段创建索引。

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

有很多帖子说数组在Cloud Firestore上运行不正常,因为当你有多个客户端可以修改的数据时,很容易混淆,因为你无法知道发生了什么以及在哪个字段上。 如果我正在使用地图并且用户想要编辑几个不同的字段,即使是完全相同的字段,我们通常也知道发生了什么。 在数组中,事情是不同的。 尝试思考如果用户想要在索引0处编辑值,可能会发生什么,某些其他用户想要删除索引0处的值,您最终会得到非常不同的结果,为什么不这样,数组超出范围异常。 因此,使用数组的Firestore操作有点不同。 因此,您无法在特定索引处执行插入,更新或删除等操作。 但是如果不关心将元素存储到数组中的确切顺序,那么您应该使用数组。 Firestore几天前添加了一些功能来添加或删除特定元素,但前提是不关心它们的确切位置。 请参阅官方文档。

作为结论,只有在需要将数据显示在一起时才将数据放在同一文档中。 也不要让它们如此之大,因此您需要下载实际需要的更多数据。 因此,当您要搜索该数据的个别字段或者您希望数据有增长空间时,请将数据放入集合中。 如果要根据该数据搜索父对象,请将数据保留为映射字段。 如果您有通常将它们用作标记的项目,请继续使用数组。

另外不要担心Firestore中的 。

  相关解决方案