我试图在firestore中动态查询〈=和〉=操作符。这意味着我想动态地添加每个键和值到查询中,但我得到一个错误,它不会在firebase上工作。
所有包含不等式(〈、〈=、〉或〉=)的where筛选器必须位于同一字段上。但您在“FieldPath([price])”和“FieldPath([meter])”上具有不等式筛选器。“package:cloud_firestore/src/query. dart”:Assert失败:第780行位置13:'具有不等式==字段'
我的代码:
class HomePage extends StatefulWidget {
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
late Query _query;
final Map<String, dynamic> _filters = {
'price': 500,
'meter': 120,
};
@override
void initState() {
super.initState();
_query = FirebaseFirestore.instance.collection('items');
for (var key in _filters.keys) {
if (_filters[key] != null) {
_query = _query.where(key, isGreaterThanOrEqualTo: _filters[key]);
}
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('My App'),
),
body: StreamBuilder<QuerySnapshot>(
stream: _query.snapshots(),
builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
if (!snapshot.hasData) {
return const CircularProgressIndicator();
}
List<DocumentSnapshot> documents = snapshot.data!.docs;
return ListView.builder(
itemCount: documents.length,
itemBuilder: (BuildContext context, int index) {
DocumentSnapshot document = documents[index];
return ListTile(
title: Text('${document['price']}'),
subtitle: Text(
'${document['meter']} m² / ${document['landMeter']} m²'),
);
},
);
},
),
);
}
}
有没有办法解决这个限制?或者动态查询?
1条答案
按热度按时间ttisahbt1#
如果您查看Firestore文档中关于查询限制的内容,它会说:
在复合查询中,范围(〈、〈=、〉、〉=)和不等于(!=、not-in)比较都必须在同一字段上筛选。
您的代码正在
price
和meter
字段上添加isGreaterThanOrEqualTo
(>=
)条件,这不符合此限制。问题并不在于动态构建查询,而在于试图在多个字段上添加
isGreaterThanOrEqualTo
条件,这是Firestore不支持的。一个选项是只对数据库执行一个条件,然后在应用程序代码中执行进一步的筛选。
另一种解决方法是(和处理NoSQL数据库时一样)添加额外的数据以支持该用例,尽管我不确定它是否适用于这里。
我能想到的最接近的方法是,您可以添加一个具有这两个值的字段:
然后可以对这个复合值执行
notEqual
查询,但是用这种方式实现双>=
并不容易,因此客户端过滤可能是唯一的选择。