【问题标题】:Cloud Firestore inequality operator exception flutterCloud Firestore 不等式运算符异常颤动
【发布时间】:2021-03-27 09:08:40
【问题描述】:

当我在我的 Flutter 应用中使用 Cloud Firestore 时,发生了奇怪的异常。

已编辑

这是我的代码:

Stream<List<Product>> productsStream(int id) async* {
    final k = _db
        .collection('products')
        .where('category_id', isEqualTo: id)
        .where('stock', isGreaterThanOrEqualTo: 1)
        .orderBy('order')
        .snapshots();

    yield* k.map((event) => event.docs
        .map((e) => Product.fromJson(
              e.data(),
            ))
        .toList());

在这里我想要实现的是检查产品是否有库存,然后然后在我的products 集合中按order 字段按升序订购产品。

但是我收到了这个奇怪的错误:

例外: 'package:cloud_firestore/src/query.dart':断言失败:第 421 行 pos 16:'field == orders[0][0]':初始 orderBy() 字段 '[[FieldPath([order]), false当调用不等式运算符时,]][0][0]' 必须与 where() 字段参数 'FieldPath([stock])' 相同。

有什么解决办法?

【问题讨论】:

  • 这能回答你的问题吗? Firestore multiple range query
  • @SimonSot 不,我认为不是。
  • 这不是什么奇怪的错误 - 根据您的代码,它是正确的,并在 Firestore 文档Order Limitations 中进行了介绍=),您的第一个订单必须在同一字段中,因此您必须将 orderBy 更改为“stock”以消除错误。
  • @Jay 奇怪的是,我的意思是我不清楚错误,因为我是 FB 的新手。感谢您的澄清。我知道如果我将orderBy('order') 更改为orderBy('stock'),它将得到修复。但我想要实现的是同时检查库存中的产品数量,然后使用我的products 集合中的order 字段按升序订购产品。我怎样才能做到这一点?你能帮忙吗?

标签: firebase flutter dart google-cloud-firestore


【解决方案1】:

这在ordering limitations documentation中有解释:

如果您包含具有范围比较(、>=)的过滤器,则您的第一个排序必须在同一字段中

所以我怀疑你应该有:

        .where('category_id', isEqualTo: id)
        .where('stock', isGreaterThanOrEqualTo: 1)
        .orderBy('stock')
        .orderBy('order')

显然这意味着它不再主要由order 订购。如果这是一个问题,您需要进行本地排序 - 在这种情况下,您可能会发现您根本不想订购服务器端。

虽然文档中没有提到“不等于”过滤器,但听起来它们在禁止过滤方面也算作范围比较。

所以基本上,我建议您要么需要在 stock 上进行本地过滤,或者您需要在 order 上本地订购 - 您不能在同一 Firestore 查询中同时执行这两项操作此时此刻。请注意,这种服务器端限制可能在未来会发生变化(对于所有范围比较,或者可能只是允许“不等于”),因此可能值得定期重新测试。 p>

【讨论】:

  • 好的,所以当我像这样_db.collection('products').where('category_id', isEqualTo: id).orderBy('stock').where('stock', isNotEqualTo:0).orderBy('order', descending: false).snapshots(); 格式化我的代码时,它将按照 stock 数量为 0 的产品不会出现并被订购的方式进行排序同时按order字段升序排列?
  • @Ruslanbek0809:不,该代码仍将首先按stock 订购 - 除非您想要按库存订购,否则您应该删除.orderBy('stock') 部分。 (顺便说一句,我建议先进行所有过滤,然后再进行所有排序......这样更容易阅读。)
  • 我已经按照你的建议做了。但仍然是同样的错误。请你再读一遍我的问题。我已经编辑了它
  • @Ruslanbek0809:您编辑的代码仍然有.where('stock', isGreaterThanOrEqualTo: 1),这是问题的原因。
  • isNotEqualTo 也给出了同样的错误。可能是什么问题?
猜你喜欢
  • 2020-06-29
  • 2021-05-06
  • 2010-11-05
  • 2020-04-05
  • 2018-03-20
  • 2015-01-05
  • 1970-01-01
  • 2010-11-28
  • 1970-01-01
相关资源
最近更新 更多