【发布时间】: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