【问题标题】:Firestore sort by field with a time conditionFirestore 按具有时间条件的字段排序
【发布时间】:2020-05-15 16:02:11
【问题描述】:

我在 Flutter 应用程序中使用 Firestore。 我有一个帖子集。每个帖子都有一个喜欢的数量和一个创建日期。 我想在上周,最后一天,上个月获得最喜欢的帖子...... 所以我必须在时间上做一个 isGreaterThanOrEqualTo 并按喜欢排序。但这是不可能的,因为我无法对两个字段进行排序。 实际上,为了解决这个问题,我在我的帖子文档中添加了 3 个字段:“月”(月数)、“周”(周数)、“日”(天数)。

我的查询是这样的:

Query query = firestore.collection("post");
query = query.where("month", isEqual: 3);
query = query.orderBy("like", descending: true);
QuerySnapshot data = await queryResult.getDocuments();

效果很好。但我想要过去 30 天最喜欢的帖子,而不是特定月份。而且我不知道是否可以使用firestore做到这一点。 获取所有文档并在之后进行排序对我来说不是一个合适的解决方案。

这个问题有解决办法吗?

【问题讨论】:

  • Firestore 不允许对不用作范围查询的字段进行排序。因此,如果您要求某个时间戳过去 30 天的范围,您将无法在另一个字段上进行排序。如果您绝对必须有一个按喜欢排序的查询,那么您将不得不想出一种方法来确定哪些文档在所需的时间范围内,而无需使用实际的范围查询。
  • 这就是我的想法,如果没有“黑客”,我想做的事情是不可能的。无论如何感谢您的回复

标签: flutter google-cloud-firestore


【解决方案1】:

Doug 已经确认这件事是不可能的。 我打算做的很简单。我将保留我的字段日、月,并添加一个字段“timeRange”(该字段将采用 1 到 10 之间的值,以定位一天中问题的大约小时)。 我将使用限制为 10 个字段的“IN”查询。

因此,如果我想要过去 24 小时的问题,例如,我会这样做: (在这个例子中,我想我们实际上是在 timeRange 5 中)

查询当天的帖子:

Query query = firestore.collection("post");
query = query.where("day", isEquals: currentDay);
query = query.where("timeRange", inArray: [0,1,2,3,4,5]);
query = query.orderBy("like", descending: true);
QuerySnapshot data = await queryResult.getDocuments();

查询昨天的帖子:

Query query = firestore.collection("post");
query = query.where("day", isEquals: yesterday);
query = query.where("timeRange", inArray: [10,9,8,7,6]);
query = query.orderBy("like", descending: true);
QuerySnapshot data = await queryResult.getDocuments();

如果有人对此解决方案有意见,欢迎提出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-05
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    • 2019-09-26
    • 2018-07-08
    • 2018-03-30
    • 2017-03-11
    相关资源
    最近更新 更多