具有索引合并(多个属性)+ 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上的文档:

在复合查询中,范围(&lt;&lt;=&gt;&gt;=)和不等于(!=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 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

合并具有非唯一索引的多个数据帧

Python pandas - 将具有多个日期索引的csv合并到单个日期索引

合并具有非唯一索引的多个熊猫数据集

合并具有多个分隔符的列

如何正确索引在具有多个连接的查询中使用的表

将具有相同列/索引的两个 pandas DataFrame 合并为一个 DataFrame