Flutter firebase获取今天在字段之间的文档-日期范围(startDate / endDate)[重复]

Posted

技术标签:

【中文标题】Flutter firebase获取今天在字段之间的文档-日期范围(startDate / endDate)[重复]【英文标题】:Flutter firebase get documents where today is in between to fields - date range (startDate / endDate) [duplicate] 【发布时间】:2020-12-20 00:21:09 【问题描述】:

我的 Firestore 中有一些带有“startDate”和“endDate”的文档。 现在我想获取今天在 startDate 和 endDate 之间的每个文档。

final DateTime dateTime = new DateTime.now();
final QuerySnapshot querySnapshot = await colRef
    .doc(docId)
    .collection('subCol')
    .where('startDate', isLessThanOrEqualTo: dateTime)
    .where('endDate', isGreaterThanOrEqualTo: dateTime)
    .get();

这个错误非常不言自明:

I/flutter (5978): 'package:cloud_firestore/src/query.dart': 失败 断言:第 490 行 pos 18:'hasInequality == field':所有地方 具有不等式( 或 >=)的过滤器必须位于同一 场地。但是您在 'FieldPath([startDate])' 和 'FieldPath([endDate])'.

但是在不过滤客户端的情况下必须有一个解决我的问题的方法。是否有可能为此创建一个索引,如果可以,它是什么样的?另一种方法是将日期范围保存在一个字段中而不是 startDate/endDate 中,但在这里我会更少知道如何过滤它。 SQL 中这么简单的问题,在 Firebase 中却很难……

亲切的问候,

雅各布

【问题讨论】:

【参考方案1】:

是的,“必须有”,但没有。你必须更实际一点。我也有类似的情况,但就我而言,我知道(我的代码、我的规则)事件不到一周。为了减少查询中读取的文档数量,我过滤了

  .where('startDate', isLessThanOrEqualTo: dateTimePlusMaximumEventInterval)
  .where('startDate', isGreaterThanOrEqualTo: dateTimeMinusMaximumEvntInterval)

(即小于未来的最大事件间隔,并且不超过过去的最大事件长度) ...然后在本地完成其余的工作。

这与 Firestore 如何使用索引快速拆分结果并以可扩展的方式分片数据有关。

【讨论】:

不幸的是,对我来说,周期也可能会更长。对于双重问题,我也很抱歉,但我希望在超过 1 1/2 年后有新的机会。我可能会去它并在本地过滤它,因为它(大多数情况下,不幸的是并非总是)相对较少的文档。我会接受你的回答,因为这是另一个问题的答案的另一种可能性,我的问题是重复的。

以上是关于Flutter firebase获取今天在字段之间的文档-日期范围(startDate / endDate)[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Flutter Firebase - 从文档中获取特定字段

Flutter Web Firebase - 通过子集合字段获取集合

如何使用 Flutter 从 Firebase 获取当前活跃用户?

如何在 Flutter 中从 Firebase Auth 获取用户 ID?

如何在firebase-flutter中为快照数据指定字段[重复]

无法在flutter中访问Firebase Firestore doc的字段[重复]