dart 为什么我不能在fluterfire中同时使用where()和orderby()

t2a7ltrp  于 2023-04-27  发布在  其他
关注(0)|答案(1)|浏览(103)

我添加了一个流到我的小部件,但当我添加orderby()和where()的同时发生以下AssertionError:
Widget:

child: StreamBuilder(
  stream: FirebaseFirestore.instance
      .collection("users")
      .doc(currenUserUid)
      .collection("chat")
      .where('modlerUid', whereNotIn: _user.blockedList)
      .orderBy("time", descending: true)
      .snapshots(),

发生异常。_AssertionError('package:cloud_firestore/src/query. dart':Assert失败:第489行位置13:'conditionField == orders[0][0]':当调用不等运算符时,初始orderBy()字段“FieldPath([time]),true[0][0]”必须与where()字段参数“FieldPath([modlerUid])”相同。

k5ifujac

k5ifujac1#

错误消息非常明确:为了使用whereNotIn子句,首先必须在同一字段上有orderBy

FirebaseFirestore.instance
  .collection("users")
  .doc(currenUserUid)
  .collection("chat")
  .orderBy("modlerUid")
  .where('modlerUid', whereNotIn: _user.blockedList)
  .orderBy("time", descending: true)
  .snapshots(),

这意味着您的结果将firstmodlerUid上排序,然后才在time上排序。这是因为Firestore的查询模型,并且没有办法以不同的方式配置它。
如果您希望结果以time顺序 * 和 * 过滤,并在modlerUid上使用whereNotIn,则必须在应用程序中重新排序结果。
要了解有关Firestore如何执行查询的更多信息,以及为什么这可能会导致您不习惯于其他数据库的某些限制,我建议您观看Get to know Cloud Firestore系列-特别是How do queries work in Cloud Firestore?上的一集

相关问题