首页 > 解决方案 > 两个时间戳之间的 Firebase Firestore 查询

问题描述

我想找到现在和即将到来(未来 30 天)但也不是过去的事件。

当我将其作为云功能运行时,我得到“不能在多个属性上使用不等式过滤器”。我是如何获得这种类型的数据的。

(忽略日期的东西有点乱的事实,我还在玩)。

// Create date 30 days in future
const searchData: Date = new Date();
searchData.setDate(searchData.getDate() + 30);

// Load data and handle empty respoonse
const response: admin.firestore.QuerySnapshot = await admin
    .firestore()
    .collection(Collections.EVENTS)
    .where("startDate", "<=", admin.firestore.Timestamp.fromMillis(searchData.valueOf()))
    .where("endDate", ">=", admin.firestore.Timestamp.fromMillis(new Date().valueOf()))
    .where("public", "==", true)
    .limit(NUMBER_OF_EVENTS)
    .get();

编辑:我想知道数据结构/查询方法,它允许我返回事件集合中现在或下个月开始的所有事件。此外,我希望查询排除已经完成的事件。每个文档(事件)上都有一个 startDate 和 endDate 时间戳。

标签: node.jsfirebasegoogle-cloud-firestorefirebase-admin

解决方案


由于您有两个字段要检查范围,因此我不确定这是否可以通过单个查询来实现。您可以做的是执行两个查询,在客户端合并结果,然后执行最终过滤器以获取精确匹配。

  1. 对事件的最长持续时间做出假设。将这段时间称为“X”。
  2. 查询 startDate 大于 now - X 且小于 now + 30 天的所有文档。将此结果集称为“A”。
  3. 查询 endDate 大于 now 且小于 now + 30 天的所有文档。将此结果集称为“B”。
  4. 在客户端上,迭代 A 和 B 的所有结果,检查开始日期和结束日期是否符合您想要的条件。

我想不出一种方法来构造你的数据,这将通过一个查询来完成。


推荐阅读