firebase - Cloud Firestore 不等式运算符异常颤动
问题描述
虽然我一直在我的颤振应用程序中使用 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 查询中同时执行这两种操作。请注意,此服务器端限制将来可能会发生变化(对于所有范围比较,或者可能只是允许“不等于”),因此可能值得定期重新测试。
推荐阅读
- snowflake-cloud-data-platform - Snowflake DB 中数据库级别的 MONITOR 权限是什么?
- sql - 如果该字段存在于临时表中,则删除该字段
- azure - 具有安全 Azure 功能后端的静态 Blazor Web 程序集
- flutter - 我如何加载 100 幅图像以在颤动中撞击?
- php - 如何处理大量的 MySQL Select。多选可能吗?
- postgresql - 从表中删除用户
- java - 类作为字段的 Java 自定义注释(HAS-A 关系)
- python - 从另一列中获取具有至少一个指定值的值
- php - php中的异步Curl请求给出了错误的请求
- sql - 在会话表中计算用户登录的最快方法是什么?