消防员|为什么所有必须将过滤器都放在同一字段上?

时间:2019-03-03 12:59:10

标签: flutter google-cloud-firestore

显然,如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)

我不明白如何不支持这种查询以及如何解决此类查询?

感谢您的帮助:-)

谢谢, 迈克尔

2 个答案:

答案 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视频系列。

另请参阅: