繁体   English   中英

来自 firebase firestore 的 Streambuilder,具有高级过滤功能

[英]Streambuilder from firebase firestore with advanced filtering

基于flutter中新版本的firebase依赖,新增了isNotEqualTo、arrayContains、arrayContainsAny、whereIn等过滤器

我尝试使用一些过滤器创建 streambuilder,我想获得符合这些条件的文档。

  1. “uid”字段值不等于当前 uid。 (不等于)
  2. “学校”字段值isEqualTo当前用户学校。(isEqualTo)
  3. “随机”字段值 isGreaterThanOrEqualTo 应用程序生成的随机数 (isGreaterThanOrEqualTo)

stream: fireStore.collection(USERS_COLLECTION).where(UID_FIELD, isNotEqualTo: me.uid).where(SCHOOL_FIELD, isEqualTo: me.school).where(RANDOM_FIELD, isGreaterThanOrEqualTo: random).limit(10).snapshots(),

条件 1 (isNotEqualTo) 对我不起作用,但条件 2 和条件 3 工作正常,当我添加过滤器 1 时,向我显示错误。

具有不等式(<、<=、> 或 >=)的所有 where 过滤器必须在同一字段上。 但是您在“FieldPath([uid])”和“FieldPath([random])”上有不等式过滤器。 'package:cloud_firestore/src/query.dart':断言失败:第 486 行 pos 18:'hasInequality == field'

那是 Firestore 限制https://firebase.google.com/docs/firestore/query-data/queries

请注意:= 查询的以下限制:

只有存在给定字段的文档才能匹配查询。 您不能在复合查询中组合 not-in 和.=,在复合查询中,范围(<、<=、>、>=)和.= 比较必须都在同一字段上进行过滤。

因此,您可以在 uid 上使用.= 进行过滤,也可以在 Random 上使用 >= 进行过滤。 您不能在同一个查询中同时执行这两项操作。

我建议在没有 UID 的情况下进行过滤,并在您收到快照后让您的存储库稍后过滤掉 UID。

实际上,您可以通过创建复合索引来过滤多个字段。

Cloud Firestore 使用复合索引来支持单字段索引尚不支持的查询。

由于存在大量可能的字段组合,Cloud Firestore 不会像为单字段索引那样自动创建复合索引。 相反,Cloud Firestore 可帮助您在构建应用时识别和创建所需的复合索引。

如果您在未先创建所需索引的情况下尝试执行上述查询,Cloud Firestore 会返回一条错误消息,其中包含一个链接,您可以按照该链接创建缺失的索引。 每当您尝试索引不支持的查询时,都会发生这种情况。 您还可以使用控制台或使用 Firebase CLI 手动定义和管理复合索引。 有关创建和管理复合索引的更多信息,请参阅管理索引。

https://firebase.google.com/docs/firestore/query-data/index-overview#composite_indexes

此外,如果在您的代码中从快照调用requireData ,您将在日志中看到一个直接链接,用于在 Firebase 上创建该索引。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM