【问题标题】:Firestore query and filtering how to do for leaderboardFirestore查询和过滤排行榜如何做
【发布时间】:2021-06-02 00:13:02
【问题描述】:

我正在创建一个带有 Flutter 的任务应用程序,我正在显示一个排行榜,其中包含一天中 15 位最佳球员、15 位一周最佳球员和 15 位一个月最佳球员。用户可以按天、周或月过滤,我会向他们显示结果列表,按完成任务最多的人排序。

现在,我计划进行一个月查询并按客户筛选周和日,而不是对日、周、月进行 3 次查询。这是我的查询:

Timestamp get timeLimit {
    final limit = DateTime.now().subtract(const Duration(days: 30));
    return Timestamp.fromDate(limit);
  }

    getRanking() async {
        List<Data> _rankingResult = [];
    
    
        QuerySnapshot snapshot = 
        await FirebaseFirestore.instance
        .collection('tasks')
        .where('dateWhenProofed', isGreaterThanOrEqualTo: timeLimit)
        .limit(15) <- what about that?
        .get();
        
        snapshot.docs.forEach((document) {
          Data data = Data.fromJson(document.data());
          _rankingResult.add(data);
          _rankingResult.sort((a, b) => b.finishedTasksCount.compareTo(a.finishedTasksCount));
        });

    notifier.rankingList = _rankingResult;

  }

我想知道.limit()。我只需要每个过滤器的 15 个最佳结果,但是如果我们在这里有 1000 个文档,limit() 究竟是如何工作的?它是从任务集合中检查整个 Firestore 文档还是只检查前 15 个?我的目标是从中获得 15 个最高值。

我还想知道我们这里是否有 15 个结果,并且我只将它过滤到客户端到一周,我怎样才能确保在那里也获得一周的 15 个结果?也许我不必限制月份查询呢?如果有人对此有想法会很好。

编辑:

好吧,我不是 100% 确定(应该有人确认),但看起来在查询中使用 limit(),我们正在切割前 15 名列表中的数据。我认为我们可以通过添加orderBy() 参数来避免这种情况。查询现在看起来像这样:

QuerySnapshot snapshot = 
    await FirebaseFirestore.instance
    .collection('tasks')
    .where('dateWhenProofed', isGreaterThanOrEqualTo: timeLimit)
    .orderBy('dateWhenProofed', descending: true) <--- added this line
    .limit(15)
    .get();

snapshot.docs.forEach((document) {
              Data data = Data.fromJson(document.data());
              _rankingResult.add(data);
              _rankingResult.sort((a, b) => b.finishedTasksCount.compareTo(a.finishedTasksCount));
            });

应用此功能后,我们可以确保获取所有数据。现在唯一不适合的是现在只过滤到星期和日期,因为我们在查询中说,timeLimit 是 30 天。我们现在如何进行周数据过滤最佳实践?

【问题讨论】:

    标签: firebase flutter google-cloud-firestore


    【解决方案1】:

    您对 .limit() 的假设是正确的,这只会为您提供前 15 个结果。您可以简单地更改您的 timeLinit 变量来获取每天的 timeLimit:

    //today
    final limit = DateTime.now();
    
    //one week
    final limit = DateTime.now().subtract(const Duration(days: 7));
    

    【讨论】:

      猜你喜欢
      • 2020-05-26
      • 1970-01-01
      • 1970-01-01
      • 2020-07-11
      • 1970-01-01
      • 2020-06-14
      • 2013-04-12
      • 1970-01-01
      • 2018-01-06
      相关资源
      最近更新 更多