Flutter Firestore查询报错:java.lang.IllegalArgumentException: Invalid query
问题排查:Firestore查询抛出orderBy字段不匹配异常
问题代码
FirebaseTransactionRepository(this.userId) : transactionCollection = firestore.FirebaseFirestore.instance.collection('users').doc(userId).collection('transactions'); var query = transactionCollection.orderBy('created_date', descending: transactionQuery.sortOrder == SortOption.Newest); if (transactionQuery.fromDate != null) { query = transactionCollection.where('created_date', isGreaterThanOrEqualTo: transactionQuery.fromDate); } if (transactionQuery.toDate != null) { query = transactionCollection.where('created_date', isLessThanOrEqualTo: transactionQuery.toDate); } if (transactionQuery.lastDocument != null) { query = query.startAfterDocument(transactionQuery.lastDocument!); } return query.limit(transactionQuery.limit).get().then((snapshot) { final List<Transaction> transactions = snapshot.docs.map((doc) => Transaction.fromEntity(TransactionEntity.fromSnapshot(doc))).toList(); firestore.DocumentSnapshot? lastDocument; if (snapshot.docs.isNotEmpty) { lastDocument = snapshot.docs.last; } return TransactionQueryResult(transactions: transactions, query: transactionQuery.copyWith(lastDocument: lastDocument)); });
运行时错误
java.lang.IllegalArgumentException: Invalid query. You have an inequality where filter (whereLessThan(), whereGreaterThan(), etc.) on field 'created_date' and so you must also have 'created_date' as your first orderBy() field, but your first orderBy() is currently on field 'name' instead.
问题原因与修复
核心错误是添加where条件时覆盖了原有带orderBy的查询。你每次判断日期条件时,都直接从transactionCollection创建新的查询对象,完全丢弃了之前已经设置好的orderBy('created_date')逻辑。当最终执行查询时,Firestore看不到针对created_date的排序规则,就会抛出异常(错误信息里的'name'属于误导性描述,实际是查询丢失了正确的orderBy配置)。
修复方法是在已有查询的基础上链式叠加where条件,而不是重新创建查询:
var query = transactionCollection.orderBy('created_date', descending: transactionQuery.sortOrder == SortOption.Newest); // 改为在query基础上叠加where,而非从collection重新创建 if (transactionQuery.fromDate != null) { query = query.where('created_date', isGreaterThanOrEqualTo: transactionQuery.fromDate); } if (transactionQuery.toDate != null) { query = query.where('created_date', isLessThanOrEqualTo: transactionQuery.toDate); } if (transactionQuery.lastDocument != null) { query = query.startAfterDocument(transactionQuery.lastDocument!); } // 后续逻辑保持不变
这样修改后,查询会始终保留created_date的排序规则,同时正确叠加日期过滤条件,符合Firestore的查询规则要求。
内容的提问来源于stack exchange,提问作者Minh Danh
相关产品推荐
相关产品推荐

