具有索引合并(多个属性)+ orderby 的 Firebase 不起作用
Posted
技术标签:
【中文标题】具有索引合并(多个属性)+ orderby 的 Firebase 不起作用【英文标题】:Firebase with index merging ( multiple properties )+ orderby doesn't work 【发布时间】:2022-01-18 02:59:45 【问题描述】:我为一个集合创建一个索引
数据库
收藏:收藏1 数据示例:
date: 1638926138,
azd: la: 481.120599, lo: 221.0256055 ,
po: 123456,
st: 123456,
user: OeS2,
索引 1
ID 集合:collection1 字段索引:azd.la -> 升序,日期 => 降序, 状态:激活
请求 1
我从这个请求开始,它的工作
firestore()
.collection(COLLECTION)
.orderBy("azd.la")
.where("azd.la", ">=", a_min)
.where("azd.la", "<=", a_max)
.orderBy('date', 'desc')
.get()
如果我用 3 个属性(azd.la、azd.lo、日期)更新我的索引
索引 1 已更新
ID 集合:collection1 字段索引:azd.la -> 升序,azd.lo -> 升序,日期 => 降序, 状态:激活
firestore()
.collection(COLLECTION)
.orderBy("azd.la")
.where("azd.la", ">=", a_min)
.where("azd.la", "<=", a_max)
.orderby("azd.lo")
.where("azd.lo", ">=", b_min)
.where("azd.lo", "<=", b_max)
.orderBy('date', 'desc')
.get()
我有一个错误 可能的未处理承诺拒绝(id:0): 错误:firebase.firestore().collection().where() 查询无效。具有不等式(、!= 或 >=)的所有 where 过滤器必须位于同一字段中。但是您在“azd.la”和“azd.lo”上有不等式过滤器
我有另一个索引,但我不知道问题是否完全相同
索引 2
ID 集合:collection1 字段索引:azd.la -> 升序,azd.lo -> 升序,po -> 升序,日期 => 降序, 状态:激活
firestore()
.collection(COLLECTION)
.orderBy("azd.la")
.where("azd.la", ">=", a_min)
.where("azd.la", "<=", a_max)
.orderby("azd.lo")
.where("azd.lo", ">=", b_min)
.where("azd.lo", "<=", b_max)
.orderby("po")
.where("po", "==", 123456)
.orderBy('date', 'desc')
.get()
感谢您的帮助
【问题讨论】:
【参考方案1】:这行不通:
.collection(COLLECTION)
.orderBy("azd.la")
.where("azd.la", ">=", a_min)
.where("azd.la", "<=", a_max)
.orderby("azd.lo")
.where("azd.lo", ">=", b_min)
.where("azd.lo", "<=", b_max)
来自query limits上的文档:
在复合查询中,范围(
<
、<=
、>
、>=
)和不等于(!=
、not-in
)比较都必须在同一字段上进行过滤。
所以没有办法对两个字段执行范围查询,比如这里的经度和纬度。
这也是为什么在my answer to your previous question 中我建议查看implementing geoqueries on Firestore 上的 Firebase 文档。如果您想了解有关 Firestore 的此限制以及地理查询解决方案如何解决此限制的更多信息,请观看我几年前的演讲视频:Querying Firebase and Firestore based on geographic location or distance
【讨论】:
感谢地理定位,但是,这是数据的一个例子。在 where 条件下不可能有更多 2 个属性?如果我使用带有 po、st 和 date 的索引。我也有错误。如果我理解,我不能在 where 条件下使用 2 个属性? 您可以对许多属性进行相等检查,但所有范围查询和not
条件必须在同一个字段上。我建议查看我链接的视频以了解原因。以上是关于具有索引合并(多个属性)+ orderby 的 Firebase 不起作用的主要内容,如果未能解决你的问题,请参考以下文章