首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于获取具有starDate和endDate的文档的Firebase日期范围查询

用于获取具有starDate和endDate的文档的Firebase日期范围查询
EN

Stack Overflow用户
提问于 2019-04-29 15:37:06
回答 1查看 596关注 0票数 1

我的Firestore数据库上有一个任务集合,如下所示:

代码语言:javascript
复制
"tasks": {
    v8NC4GovVOPe21fhwtp0 : {
        id: "v8NC4GovVOPe21fhwtp0"
        status: 0
        dateFrom: 30 april 2019 at 00:00:00 UTC-3
        dateTo: 05 may 2019 at 00:00:00 UTC-3
        ....
    },
    v7NC4GaxVOPe48ftstp1 : {
        id:"v7NC4GaxVOPe48ftstp1"
        status: 0
        dateFrom: 29 april 2019 at 00:00:00 UTC-3
        dateTo: 02 may 2019 at 00:00:00 UTC-3
        ....
    }
}

文档有一个dateFrom字段,它指示用户开始处理该任务的第一次日期,还有一个dateTo字段,该字段表示用户必须完成该任务的最后一天。

我试图从2019年4月开始获取所有任务,这意味着dateFromdateTo都属于这个月/年(在本例中,如果这个月是4月-2019年,它必须同时获取这两个任务)。

在Android上,我从选定的月份(startDate)和选定的月份(endDate)中获得第一次约会(endDate),并尝试执行以下操作:

代码语言:javascript
复制
val missionsCollection = FirebaseFirestore.getInstance()
        .collection("/users").document(uid).collection("tasks")
        .whereGreaterThanOrEqualTo("dateFrom", startDate).whereLessThanOrEqualTo("dateTo", endDate)

但是我说All where filters other than whereEqualTo() must be on the same field. But you have filters on 'dateFrom' and 'dateTo'时出错了。

我想了一些解决办法,但看起来都很糟糕,即使我找不到一个很好的解决办法,我相信肯定会有一个解决办法的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-30 09:35:01

Firestore允许链接多个"where()“方法,以创建更具体的查询,但只能在同一字段上进行。正如您可能在有关查询限制的官方文档中看到的那样

云修复不支持以下类型的查询:

  • 在不同字段上使用范围筛选器的查询,如上一节所述。

因此,不同领域的距离滤波器是被禁止的。

要实现您想要的结果,您需要两次查询数据库,一次查询fiter数据,然后调用:

代码语言:javascript
复制
.whereGreaterThanOrEqualTo("dateFrom", startDate)

第二,通过呼叫:

代码语言:javascript
复制
.whereLessThanOrEqualTo("dateTo", endDate)

但不幸的是,您不能在同一个查询中使用它们。

编辑:

在设计数据库模式时,基本上是为查询构建数据库模式。因此,除了可以在查询中的一个字段和客户端代码中的另一个字段上进行筛选的上述解决方案之外,还有另一种方法,可以以某种方式将两个区域的值组合为一个字段,从而允许用例与单个字段合并。

到目前为止,我看到的最成功的例子之一是在Geohashes中使用的组合来过滤纬度和经度,正如Frank在以下视频中所解释的那样:

了解这两种解决方案的不同之处,我建议使用第一种解决方案。

还有第三种解决方案,您应该将Mar中的所有任务添加到一个集合中。然后,您可以使用以下方法查询这个新集合:

代码语言:javascript
复制
 db.collection("tasks-aps-mar")
    .whereGreaterThanOrEqualTo("day", 1)
    .whereLessThanOrEqualTo("day", 30);

甚至更普遍的解决方案是将每个月的任务存储在一个集合中,然后执行一个查询,以获得与所需月份对应的所有任务。在用例中,您应该查询数据库以获取每个集合( tasks-mar-2019tasks-apr-2019tasks-may-2019等)中的一个文档。

关于您的注释,使用数组根本无助于您,因为您不能使用范围间隔。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55906586

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档