【问题标题】:how to reduce cloud firestore reads?如何减少 Cloud Firestore 读取?
【发布时间】:2021-05-22 12:46:44
【问题描述】:

我有一个从用户接收查询字符串的搜索栏,如果查询字符串为空,就像我刚刚启动搜索操作一样,它会获取帖子集合中的所有文档...如果用户开始在搜索栏中输入...它将输入的文本与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&lt;QueryStringProvider&gt; 中的流构建器,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)当用户删除查询字符串并取消过滤并且查询字符串现在为空时...这是否意味着我将再次对云集合进行新的完整读取...所以每次用户键入或删除我再次遍历所有集合的查询字符串?*

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

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

非常感谢。

【问题讨论】:

  • 您应该尝试在 Firebase 实时数据库和 Cloud Firestore 之间混合数据。
  • 是的,为什么不......但是这种组合的主要好处是什么?!......每个帖子都将包含我存储在云 Firestore 集合“帖子”中的数据......和多媒体文件,我通过帖子 ID 将它们存储在 Firebase 存储中......所以每个帖子都会一路获取其多媒体文件......在这里使用 Firebase 实时数据库的主要好处是什么?
  • 混合的好处是 Firebase 实时数据库不会根据数据被读取、写入或删除的次数计算价格。因此,通过将您的一些数据转移到 RTDB,您的多次读取、写入将被保存。
  • 我明白了……不知道 RTBD 是这样计算的……我会彻底检查 RTDB 并比较账单将如何受到这种转变的影响……再次感谢为我指出这个方向:)

标签: firebase flutter dart google-cloud-firestore


【解决方案1】:

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

【讨论】:

  • 是的,我明白...我可以使用 RegExp 检查输入的文本是否符合我们的标准...但是此屏幕的目的...是按时间顺序列出所有帖子...就像 facebook 的帖子主页一样...但是我们实现了过滤来对它们进行排序...我在这里担心的是一次又一次地重新阅读整个帖子集合,并每次增加多余的阅读次数查询字符串更改
猜你喜欢
  • 2019-10-22
  • 2021-04-04
  • 2021-11-23
  • 2020-06-07
  • 2021-06-08
  • 2019-12-29
  • 1970-01-01
  • 1970-01-01
  • 2019-02-01
相关资源
最近更新 更多