CloudFirestore不等式运算符异常抖动

当我在我的 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());

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

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

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

什么可能是解决方案?

回答

这在订购限制文档中进行了解释:

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

所以我怀疑你应该有:

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

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

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

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


以上是CloudFirestore不等式运算符异常抖动的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>