我很好奇使用此代码搜索集合中的文档的效率.随着集合中文档数量的增加以及数组中项目数量的增长,这种搜索效率会非常低下吗?有没有更好的方法来实现这一点,或者我是否可以对数据库进行架构更改以更好地优化这一点?有什么地方我可以找到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 response = new FirestoreRecyclerOptions.Builder()
.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上运行不正常,因为当你有多个客户端可以修改的数据时,很容易混淆,因为你无法知道发生了什么以及在哪个字段上.如果我正在使用地图并且用户想要编辑几个不同的字段,即使是完全相同的字段,我们通常也知道发生了什么.在数组中,事情是不同的.尝试思考如果用户想要在索引0处编辑值,可能会发生什么,某些其他用户想要删除索引0处的值,您最终会得到非常不同的结果,为什么不这样,数组超出范围异常.因此,使用数组的Firestore操作有点不同.因此,您无法在特定索引处执行插入,更新或删除等操作.但是如果不关心将元素存储到数组中的确切顺序,那么您应该使用数组. Firestore几天前添加了一些功能来添加或删除特定元素,但前提是不关心它们的确切位置.见here官方文档.

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

也不要担心Firestore中的slow query.

标签:java,android,firebase,google-cloud-firestore,firebaseui