显然,如here所述,Firestore不支持在不同字段上使用范围过滤器进行查询:
我的问题是,为什么?
例如,如何通过时间和位置查询
Firestore.instance.collection('events')
.where("eventTime", isGreaterThanOrEqualTo: DateTime.now().millisecondsSinceEpoch)
.where("eventLocation", isGreaterThan: lesserGeopoint)
.where("eventLocation", isLessThan: greaterGeopoint)
.where("eventStatus", isEqualTo: "created")
.orderBy('eventLocation', descending: false)
.orderBy('eventTime')
.snapshots(),
(来自用Dart编写的Flutter App的示例)
我收到以下错误消息:
除whereEqualTo()以外的所有其他过滤器都必须位于同一字段上。但是您在'eventTime'和'eventLocation'上设置了过滤器,为null)
我不明白如何不支持这种查询以及如何解决此类查询?
感谢您的帮助:-)
谢谢, 迈克尔
答案 0 :(得分:1)
您已经通读了page on indexes,它描述了如何支持某些复合查询以及如何创建和使用复合索引吗?
答案 1 :(得分:1)
Cloud Firestore为其允许的任何读取操作提供了强大的性能保证:读取操作所需的时间取决于您正在读取的项目数,而不取决于集合中的项目数。这是一个非常独特的性能保证,因为这意味着拥有100万用户和拥有10亿用户的查询所花费的时间相同。
Firestore仅提供可以维护此性能保证的查询操作。这是您在Firestore查询API中可能会发现限制的主要原因。
要解决该限制,通常将对查询中的主字段执行过滤和排序,然后在客户端的辅助字段上进行排序
如果您想了解有关Firestore的查询功能和限制的更多信息,我强烈建议观看How do queries work in Cloud Firestore?和其他Get to Know Cloud Firestore视频系列。
另请参阅: