具有索引合并 + orderby 的 Firebase 不起作用
Posted
技术标签:
【中文标题】具有索引合并 + orderby 的 Firebase 不起作用【英文标题】:Firebase with index merging + orderby doesn't work 【发布时间】:2022-01-17 09:42:40 【问题描述】:我想提出一个过滤属性的请求。 我知道使用 firebase ,我们不能将 where 条件与多个不同的字段一起使用,或者将 Where 与字段属性 A 一起使用并按属性 B 排序。所以我使用索引进行测试。
我为一个集合创建一个索引
数据库
收藏:地理位置
数据示例:
date: 1638926138,
localisation: latitude: 48.120599, longitude: 2.0256055 ,
po: 1251653A,
st: pQN8,
user: OeS2
我创建一个索引:
Id collection: geo
fields index : date => descending, localisation.latitude => ascending
status : activate
请求:
import firestore from "@react-native-firebase/firestore";
firestore()
.collection(COLLECTION)
.where("localisation.latitude", ">=", lat_min)
.where("localisation.latitude", "<=", lat_max)
.get()
.then(querySnapshot => )
没关系(但我想将我的索引与字段“日期”一起使用)
import firestore from "@react-native-firebase/firestore";
firestore()
.collection(COLLECTION)
.where("localisation.latitude", ">=", lat_min)
.where("localisation.latitude", "<=", lat_max)
.orderBy('date')
.get()
.then(querySnapshot => )
错误
可能的未处理承诺拒绝(id:0):
错误:firebase.firestore().collection().orderBy() 查询无效。初始 Query.orderBy() 参数:日期必须与 Query.where() fieldPath 参数相同:调用不等式运算符时的 localisation.latitude
感谢您的帮助!
解决
哦,它的工作谢谢 只是现在 如果我会用这个请求进行测试
firestore()
.collection(COLLECTION)
.orderBy("localisation.latitude")
.where("localisation.latitude", ">=", lat_min)
.where("localisation.latitude", "<=", lat_max)
.orderBy('date', 'desc')
.get()
索引宽度:
localisation.latitude => ascending
date => descending
但我用 localisation.longitude 测试
其他测试
我的索引:
localisation.latitude => ascending
localisation.longitude => ascending
date => descending
我的请求
firestore()
.collection(COLLECTION)
.orderBy("localisation.latitude")
.where("localisation.latitude", ">=", lat_min)
.where("localisation.latitude", "<=", lat_max)
.orderBy("localisation.longitude")
.where("localisation.longitude", ">=", lon_min)
.where("localisation.longitude", "<=", lon_max)
.orderBy('date', 'desc')
没用
错误
Possible Unhandled Promise Rejection (id: 0):
Error: firebase.firestore().collection().where() Invalid query. All where filters with an inequality (<, <=, >, != or >=) must be on the same field. But you have inequality filters on 'localisation.latitude' and 'localisation.longitude'
【问题讨论】:
【参考方案1】:如错误消息所述,您需要先在localisation.latitude
上订购,然后再在date
上订购。
firestore()
.collection(COLLECTION)
.orderBy("localisation.latitude")
.where("localisation.latitude", ">=", lat_min)
.where("localisation.latitude", "<=", lat_max)
.orderBy('date')
您可能还需要为此特定订单创建索引。
在查询中有这两个orderBy
调用也意味着您的结果将首先按localisation.latitude
顺序排列,然后按date
顺序排列。没有办法改变这一点:
如果您希望结果按日期顺序排列,则需要在您的应用程序代码中重新排序。
无关:鉴于您是按纬度过滤的,我建议您查看geoqueries 上的文档,它允许您搜索某个区域的文档。
【讨论】:
感谢您的评论,它有效,我更新了我的帖子以进行另一个测试,其中包含 3 个字段 localisation.latitude + localisation.longitude + date ,顺序良好,请求不起作用。 ..,我不明白。 这似乎是一个新问题,所以我建议为它打开一个新问题。 --- 另见What should I do when someone answers my question? 谢谢,我会开一个新帖子。谢谢以上是关于具有索引合并 + orderby 的 Firebase 不起作用的主要内容,如果未能解决你的问题,请参考以下文章