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

时间:2019-12-27 11:02:11

标签: node.js firebase google-cloud-firestore firebase-admin

我想查找现在和将来(未来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时间戳。

3 个答案:

答案 0 :(得分:1)

从文档中

  

您只能在单个字段上执行范围比较(<,<=,>,> =),并且在复合查询中最多可以包含一个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

答案 1 :(得分:1)

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

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

我想不出一种方法来构造您的数据,只需一个查询就可以做到。

答案 2 :(得分:0)

我知道这是一个老话题,但是答案可能对其他人有用。

您最终可以做的是,您有一个$ 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);

?>

还不错吧?不客气!