Flutter环境下Firebase存储库动态查询

fnvucqvd  于 2023-03-13  发布在  Flutter
关注(0)|答案(1)|浏览(113)

我试图在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²'),
              );
            },
          );
        },
      ),
    );
  }
}

有没有办法解决这个限制?或者动态查询?

ttisahbt

ttisahbt1#

如果您查看Firestore文档中关于查询限制的内容,它会说:
在复合查询中,范围(〈、〈=、〉、〉=)和不等于(!=、not-in)比较都必须在同一字段上筛选。
您的代码正在pricemeter字段上添加isGreaterThanOrEqualTo>=)条件,这不符合此限制。
问题并不在于动态构建查询,而在于试图在多个字段上添加isGreaterThanOrEqualTo条件,这是Firestore不支持的。
一个选项是只对数据库执行一个条件,然后在应用程序代码中执行进一步的筛选。
另一种解决方法是(和处理NoSQL数据库时一样)添加额外的数据以支持该用例,尽管我不确定它是否适用于这里。
我能想到的最接近的方法是,您可以添加一个具有这两个值的字段:

price_meter: "500_120"

然后可以对这个复合值执行notEqual查询,但是用这种方式实现双>=并不容易,因此客户端过滤可能是唯一的选择。

相关问题