代码之家  ›  专栏  ›  技术社区  ›  PleaseNoBugs

使用whererraycontains进行搜索的效率

  •  4
  • PleaseNoBugs  · 技术社区  · 6 年前

    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 回复  |  直到 6 年前
        1
  •  6
  •   Alex Mamo    6 年前

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

    问题不是搜索效率会变得很低,而是文档有限制。因此,当涉及到可以将多少数据放入文档时,有一些限制。根据官方文件 usage and limits :

    文档的最大大小:1 MiB(1048576字节)

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

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

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

    有很多帖子说,数组在CloudFireStore上不能很好地工作,因为当你有可以被多个客户端更改的数据时,很容易混淆,因为你不知道发生了什么,在哪个领域。如果我使用的是地图,而用户想要编辑几个不同的字段,甚至是完全相同的字段,我们通常知道发生了什么。在一个数组中,事情是不同的。试想一下,如果一个用户想要编辑索引0处的值,另一个用户想要删除索引0处的值,那么会发生什么情况?结果会非常不同,为什么不呢?数组越界异常。所以Firestore对数组的操作有点不同。因此,不能在特定索引处执行诸如插入、更新或删除之类的操作。但是如果您不关心将元素存储到数组中的确切顺序,那么应该使用数组。Firestore几天前添加了一些功能来添加或删除特定元素,但前提是不关心它们的确切位置。看到了吗 here 正式文件。

    也不用担心 slow query 在Firestore。