我很好奇使用此代码在集合中搜索文档的效率。随着集合中文档数量的增加和数组中项目数量的增加,这种搜索是否会变得非常低效?是否有更好的方法来执行此操作,或者是否可以对数据库进行架构更改以更好地优化它? 也许在某个地方可以找到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中的查询速度很慢。