【问题标题】:Between StartDate and EndDate Firestore在 StartDate 和 EndDate Firestore 之间
【发布时间】:2019-04-03 05:15:13
【问题描述】:

我有带有startDate 和endDate 的文档。我想查询startDate 和endDate 的范围。我可以像这样查询一个日期的范围:

whereField("startDate", isGreaterThan: start).whereField("startDate, isLessThan: end)

但我不能像这样查询两个字段:

whereField("startDate", isGreaterThan: start).whereField("endDate", isLessThan: end)

在复合 where 语句中使用多个字段时,Firestore 出现异常。

【问题讨论】:

    标签: firebase google-cloud-firestore


    【解决方案1】:

    无论您用于构建应用程序的平台是什么,我确信您得到的错误是非常明确的。 Cloud Firestore 官方文档对此主题也非常明确。所以有一些query limitations,谈到Firestore:

    Cloud Firestore 不支持以下类型的查询:

    • 逻辑或查询。在这种情况下,您应该为每个 OR 条件创建一个单独的查询,并在您的应用中合并查询结果。

    因此,Firestore 查询只能对单个属性执行范围过滤。由于您尝试过滤两个属性的范围,因此您会收到该错误消息,这是预期的行为,因为这在单个 Firestore 查询中是不可能的。

    要解决此问题,您可以选择以下解决方案之一:

    • 您可以在查询中的一个(第一个)字段和客户端的另一个(第二个)字段上执行过滤,官方文档也表明。

    • 您可以通过某种方式将两个范围的值组合到一个字段中,从而使您的用例具有单个字段。这种组合的一个非常成功的例子是使用 geohashes 过滤纬度和经度属性,正如 Frank van Puffelen 在这段视频中很好地解释的那样,Querying Firebase and Firestore。

    • 另一种选择是改变您存储数据的方式并对其进行不同的建模。最简单的实现是将startDate 和endDate 中的所有项目放入一个集合中。由于您没有为平台选择标签,我将用 Javascript 编写必要的查询,但也可以简单地为其他编程语言编写。因此,您可以使用以下查询查询该集合:

        db.collection("startDate-endDate").where('date','>=', start).where('date','<=', end);
      
    • 另一种更通用的选择是将所有项目分别存储在您需要的每个时期(年、月或日)的集合中,然后执行必要数量的查询以获取您正在寻找的项目之一每个集合,itemsFromFirstYear,itemsFromSecondYear 等等。

    请同时查看官方文档:

    恕我直言,我建议选择第一个选项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-08
      • 1970-01-01
      • 2019-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-14
      相关资源
      最近更新 更多