如何减少云 Firestore 读取?

时间:2021-02-19 14:04:50

标签: firebase flutter dart google-cloud-firestore

我有一个从用户接收查询字符串的搜索栏,如果查询字符串为空,就像我刚刚启动搜索操作一样,它会获取帖子集合中的所有文档...如果用户开始在搜索栏中输入...它获取输入的文本并将其与 firestore 集合中每个文档内的字段进行比较,如果匹配...它检索匹配的文档并在屏幕上预览它们,如果用户删除了他输入的查询字符串...所以查询字符串再次为空...所以它再次获取所有文档...我使用提供程序包将查询字符串执行到数据库获取功能,如下所示:

供应商:

import 'package:flutter/foundation.dart';

class QueryStringProvider extends ChangeNotifier {
  String _queryString = '';

  String getQueryString() => _queryString;

  updateQueryString(String userQueryString) {
    _queryString = userQueryString;
    notifyListeners();
  }
}


数据库函数:

Stream<QuerySnapshot> filterAllPosts(String query) {
    return query.isEmpty
        ? _postsCollection.snapshots()
        : _postsCollection
            .where('postSubtitles', arrayContains: query)
            .snapshots();
  }

以下是一个包​​裹在 Consumer<QueryStringProvider> 中的流构建器,Streambuilder 接收从数据库提取函数中检索到的所有数据,并根据我喜欢的布局结构填充数据:

  @override
  Widget build(BuildContext context) {
    return Container(
      child: Consumer<QueryStringProvider>(
        builder: (context, data, _) {
          return StreamBuilder<QuerySnapshot>(
            // stream: DatabaseService().listenToAllGigs(),
            stream: DatabaseService().filterAllGigs(data.getQueryString()),
            builder: (context, snapshot) {
              return !snapshot.hasData
                  ? Center(child: Text(''))
                  : snapshot.data.documents.length > 0
                      ? ListView.builder(
                          itemCount: snapshot.data.documents.length,
                          itemBuilder: (context, index) {
                            DocumentSnapshot data =
                                snapshot.data.documents[index];
                            Map getDocData = data.data;

                            return GestureDetector(
                              child: PostItem(
                                appointed: getDocData['appointed'],
                                appointedUserFullName:
                                    getDocData['appointedUserFullName'],
                                postId: getDocData['gigId'],
                                postTitle: getDocData['postTitle'],
                                postSubtitles: getDocData['postSubtitles'],
                                postBody: getDocData['postBody'],
                                // onDeleteItem: () => model.deleteGig(index),
                              ),
                            );
                          })
                      : Center(
                          child: Text(
                          'No Posts matching your criteria',
                          style: TextStyle(fontSize: 16),
                        ));
            },
          );
        },
      ),
    );
  }


关于如何使用上述代码减少云读取,我有三个问题:

1) 是否有任何问题,当我启动搜索操作并且查询字符串为空时,我获取了所有文档?

2)当用户开始在搜索栏中输入时...这是否意味着所有获取的数据都丢失了...我们正在通过过滤再次进行新的读取?...或者它只是过滤了我的内容从一开始就已经从启动搜索操作中获取了吗?

3) 当用户删除查询字符串并取消过滤并且查询字符串现在为空时...这是否意味着我将再次对云集合进行新的完整读取...所以每次用户键入或删除我再次遍历所有集合的查询字符串?*

如果问题太长,请执行我...但它更接近理论概念而不是代码...

任何澄清将不胜感激...

非常感谢。

1 个答案:

答案 0 :(得分:0)

我的建议是仅当用户输入了特定数量的字符并且所有字符都有效时才查询结果。 比如,就我而言,我确保用户输入了至少 3 个字符,并且都是字母或数字。