我的Firestore数据库上有一个任务集合,如下所示:
"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月开始获取所有任务,这意味着dateFrom或dateTo都属于这个月/年(在本例中,如果这个月是4月-2019年,它必须同时获取这两个任务)。
在Android上,我从选定的月份(startDate)和选定的月份(endDate)中获得第一次约会(endDate),并尝试执行以下操作:
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'时出错了。
我想了一些解决办法,但看起来都很糟糕,即使我找不到一个很好的解决办法,我相信肯定会有一个解决办法的。
发布于 2019-04-30 09:35:01
Firestore允许链接多个"where()“方法,以创建更具体的查询,但只能在同一字段上进行。正如您可能在有关查询限制的官方文档中看到的那样
云修复不支持以下类型的查询:
因此,不同领域的距离滤波器是被禁止的。
要实现您想要的结果,您需要两次查询数据库,一次查询fiter数据,然后调用:
.whereGreaterThanOrEqualTo("dateFrom", startDate)第二,通过呼叫:
.whereLessThanOrEqualTo("dateTo", endDate)但不幸的是,您不能在同一个查询中使用它们。
编辑:
在设计数据库模式时,基本上是为查询构建数据库模式。因此,除了可以在查询中的一个字段和客户端代码中的另一个字段上进行筛选的上述解决方案之外,还有另一种方法,可以以某种方式将两个区域的值组合为一个字段,从而允许用例与单个字段合并。
到目前为止,我看到的最成功的例子之一是在Geohashes中使用的组合来过滤纬度和经度,正如Frank在以下视频中所解释的那样:
了解这两种解决方案的不同之处,我建议使用第一种解决方案。
还有第三种解决方案,您应该将Mar中的所有任务添加到一个集合中。然后,您可以使用以下方法查询这个新集合:
db.collection("tasks-aps-mar")
.whereGreaterThanOrEqualTo("day", 1)
.whereLessThanOrEqualTo("day", 30);甚至更普遍的解决方案是将每个月的任务存储在一个集合中,然后执行一个查询,以获得与所需月份对应的所有任务。在用例中,您应该查询数据库以获取每个集合( tasks-mar-2019、tasks-apr-2019、tasks-may-2019等)中的一个文档。
关于您的注释,使用数组根本无助于您,因为您不能使用范围间隔。
https://stackoverflow.com/questions/55906586
复制相似问题