Firebase 云Firestore不平等运算符异常颤振

Firebase 云Firestore不平等运算符异常颤振,firebase,flutter,dart,google-cloud-firestore,Firebase,Flutter,Dart,Google Cloud Firestore,当我在Flitter应用程序中使用CloudFireStore时,发生了一个奇怪的异常 已编辑 这是我的代码: Stream<List<Product>> productsStream(int id) async* { final k = _db .collection('products') .where('category_id', isEqualTo: id) .where('stock', isGreater

当我在Flitter应用程序中使用CloudFireStore时,发生了一个奇怪的异常

已编辑

这是我的代码

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());
流产品流(int-id)异步*{
最终k=_db
.集合(“产品”)
.where('category_id',isEqualTo:id)
其中(“股票”大于或等于1)
.orderBy(“订单”)
.快照();
收益率*k.map((事件)=>event.docs
.map((e)=>Product.fromJson(
e、 数据(),
))
.toList());
在这里,我想实现的是检查产品是否有库存,然后通过我的
产品
集合中的
订单
字段以升序订购产品

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

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

可能的解决方案是什么?

这在以下章节中进行了解释:

如果包含带范围比较(=)的筛选器,则第一次排序必须在同一字段上

所以我想你应该:

.where('category_id',isEqualTo:id)
其中(“股票”大于或等于1)
.orderBy(“库存”)
.orderBy(“订单”)
显然,这意味着它不再主要按
顺序进行排序。如果这是一个问题,您需要进行本地排序-在这种情况下,您可能会发现您根本不想订购服务器端

虽然文档中没有提到“不等于”过滤器,但从禁止过滤的角度来看,它们似乎也算作范围比较

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

这在以下章节中解释:

如果包含带范围比较(=)的筛选器,则第一次排序必须在同一字段上

所以我想你应该:

.where('category_id',isEqualTo:id)
其中(“股票”大于或等于1)
.orderBy(“库存”)
.orderBy(“订单”)
显然,这意味着它不再主要按
顺序进行排序。如果这是一个问题,您需要进行本地排序-在这种情况下,您可能会发现您根本不想订购服务器端

虽然文档中没有提到“不等于”过滤器,但从禁止过滤的角度来看,它们似乎也算作范围比较



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

这是否回答了您的问题?@SimonSot不,我认为不是。这不是奇怪的错误-根据您的代码,如果您包括带范围比较的过滤器(=),它是正确的,并且包含在Firestore文档中,您的第一次订购必须在同一字段上,因此您必须将您的orderBy更改为“stock”以删除错误。@Jay By strange我的意思是我的错误不清楚,因为我是FB的新手。感谢您的澄清。我知道如果我将
orderBy('order')
更改为
orderBy('stock'))
它将得到修复。但我想实现的是同时检查库存中的产品数量,然后使用我的
产品
集合中的
订单
字段按升序订购产品。我如何实现这一点?你能帮我一把吗?这回答了你的问题吗?@SimonSot不,我想不是。那这不是一个奇怪的错误-根据您的代码,如果您包含一个带有范围比较(=)的过滤器,则该错误是正确的,并包含在Firestore文档中,您的第一次订购必须在同一字段上,因此您必须将您的orderBy更改为“stock”以删除错误。@Jay By strange我的意思是我的错误不清楚,因为我是FB的新手。感谢您的澄清。我知道如果我将
orderBy('order')
更改为
orderBy('stock'))
它将得到修复。但我想实现的是同时检查库存中的产品数量,然后使用我的
产品
集合中的
订单
字段按升序订购产品。我如何实现这一点?你能帮我一下吗?好的,当我这样格式化我的代码时('products')。其中('category_id',isqualto:id.)。orderBy('stock')。其中('stock',isNotEqualTo:0)。orderBy('order',descending:false)。快照();
然后它将按照这样的方式进行排序:库存量为0的产品将不会出现,并且将按订单字段同时按升序订购?@Ruslanbek0809:不,该代码仍将首先按
库存进行订购
除非您想按库存订购,否则应删除
.orderBy('stock')
部分。(顺便说一句,我建议先把所有的过滤放在首位,然后再把所有的排序放在首位……这样读起来更简单。)我已经按照你的建议做了。但仍然是同样的错误。你能不能再次阅读我的问题。我已经编辑过了it@Ruslanbek0809:您编辑的代码仍有
。其中('stock',大于或等于0:1)
,这是问题的原因。
isNotEqualTo
是als