【问题标题】:Why does query firestore not return the expected result using order 2 times为什么查询 firestore 不使用 order 2 次返回预期结果
【发布时间】:2023-02-07 22:46:25
【问题描述】:

在为 firebase 编写复合查询时,我遇到了一个问题。

我使用文档https://firebase.google.com/docs/firestore/solutions/geoqueries?hl=en&%3Bauthuser=0&authuser=0 中指定的 geoHash 过滤 除此之外,我想使用格式为“>=”或“<=”的其他排序标准。

同样在文档中写道,当使用运算符“>=”或“<=”时,有必要通过此属性设置顺序

当我使用我的参数编写查询时,它返回一个空数组。

请求看起来像这样:

query(
    collection(db, '/some'),
    where('some', '==', arg),
    where('some another', '==', arg),
    where('some another', 'array-contains-any', arg),
    where('price', '>=', minPrice),
    orderBy('price'),
    orderBy('geoHash'),
    startAt(b[0]),
    endAt(b[1]),
    limit(Math.ceil(DEFAULT_LIMIT_OF_LISTINGS - promises.length))
)

当我们添加按价格过滤并按价格排序时,查询不返回任何内容。

我通过将查询分为两个不同的部分来检查我的查询。一切正常。我的数据也没有问题。控制台中也没有来自 firebase 的错误

【问题讨论】:

  • 你创建了一个index吗?

标签: javascript firebase google-cloud-firestore geohashing


【解决方案1】:

Firestore 查询只能包含一个关系条件(>=、> 等),因为此类条件只能在索引的第一个字段上进行评估。由于您已经需要 geohash 的关系/范围条件,因此您不能在价格上也有 >= 条件。

解决此问题的常见选项是:

在您的应用程序代码中对第二个条件执行过滤器,以便您首先获得范围内的所有文档,然后在您的应用程序中删除价格超出范围的文档。 在您的数据库中添加一个字段,以允许您想要的用例。例如,如果您添加一个字段 isPriceOver4000: true,您可以使用相等条件 .where('isPriceOver4000', '==', true)。 最后一个选项可能感觉不对,但在使用 NoSQL 修改和扩充数据模型以适应您的用例时实际上很常见。当然,您会希望找到满足您需求的最佳模型,例如,您可能需要用户可以过滤的价格标签数组(或地图子字段)。

或者,您可以创建类似的区域桶,并在其中查询位置而不是 geohash,然后使用 >= 价格。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多