【问题标题】:Firestore error: Cannot use multiple conditional where clauses on different propertiesFirestore 错误:不能在不同属性上使用多个条件 where 子句
【发布时间】:2020-12-21 11:10:45
【问题描述】:

我想在 Firestore 查询中使用多个“where”过滤器,我的查询基于上述 example

我的查询:

let colRef = firebase.firestore().collectionGroup('volumes')
colRef = colRef.where('days', 'array-contains', day)
colRef = colRef.where('start_time', '<=', time)
colRef = colRef.where('end_time', '>', time)
colRef = colRef.where('volume', '>', 0)
const snapshot = await colRef.get()

我收到上述错误:

错误:3 INVALID_ARGUMENT:不能对多个不等式过滤器 属性

我检查了compounding Firestore queries,发现:

您只能对单个字段执行范围(、>=)或不等于(!=)比较

这是对 Firestore 查询的巨大限制。我是否缺少实现该查询的另一个选项?

谢谢!

【问题讨论】:

    标签: javascript node.js firebase google-cloud-firestore


    【解决方案1】:

    Firestore 中的范围条件只能应用于单个字段。这是一个硬性限制,有据可查(正如您已经包含在您的问题中)。

    Firestore 仅提供能够满足其性能保证的 API,其中主要的一个是查询返回结果的时间与返回的数据量有关,与返回的数据量无关 需要搜索这些结果的数据量。

    如果您需要比 Firestore 提供的更灵活的查询,则应考虑使用其他数据库。但是您可能会失去与其他数据库的 Firestore 性能保证。

    【讨论】:

    • 有点失望,因为在某些情况下不需要性能,但需要价格效率。我希望 Firestore 成本更多地取决于资源性能(例如 CPU 和 RAM),而不是读取量。不准确的查询会导致无效的读取,即使对于小型应用程序也会花费很多钱。我认为 Firebase 具有巨大的潜力,但它必须改变定价以更多地基于资源。感谢您的诚实回答。
    • 不支持此操作与成本无关,纯粹是因为性能问题。由于 Firestore 工程师尚未找到保证多字段范围查询性能的方法,因此不受支持。
    • 为什么客户要为非资源的东西付费? (如 CPU、RAM、带宽等)。 Firestore“读取”不是资源,它只是获得更多资金的一种方式。我更愿意为我使用的资源而不是“读取”、“写入”或“删除”支付更多费用。客户“阅读”是 Firestore 上一项非常昂贵的服务,而且不合理。我可以低效率地阅读一百万行的文档,或者我可以通过 DocId 获得一个小文档,我将被收取 SMAE 费用。这没有任何意义。
    猜你喜欢
    • 2018-06-10
    • 2018-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-29
    • 2016-12-19
    相关资源
    最近更新 更多