具有索引合并 + 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 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

合并具有不同索引的熊猫系列(对齐一个索引)

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

合并具有索引的数据帧,其中一个包含另一个(但不相同)

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

熊猫合并具有相同值和相同索引的行

Pandas:合并具有不同索引和缺失值的两个数据框