繁体   English   中英

两个时间戳之间的 Firebase Firestore 查询

[英]Firebase Firestore Query Between Two Timestamps

我想找到现在和即将发生的事件(未来 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 时间戳。

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

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

我想不出一种结构化数据的方法,可以通过单个查询来完成此操作。

从文档:

您只能对单个字段执行范围比较(<、<=、>、>=),并且您最多可以在复合查询中包含一个 array-contains 或 array-contains-any 子句:

citiesRef.where("state", ">=", "CA").where("state", "<=", "IN");
citiesRef.where("state", "==", "CA").where("population", ">", 1000000);

https://firebase.google.com/docs/firestore/query-data/queries

我知道这是一个旧线程,但答案可能对其他人有好处。

正如我最后所做的那样,你可以做的是你有一个 $start_date 和一个 $target_date。

然后你这样做:

<?php
$start = strtotime('2021-11-22');
$target = strtotime('2022-01-01 0:00:00');

$limit = (($target - $start) / 86400);

$query = $col_data->where('date.day_start', '>=', $start);
$query = $query->limit($limit);

?>

还不错吧? 没关系!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM