Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Firebase Firestore Query Between Two Timestamps

I want to find events that are a on now and upcoming (next 30 days) but that are also not in the past.

When i run this as a cloud function, I get "Cannot have inequality filters on multiple properties". How am I meant to get this type of data.

(ignore the fact that the date stuff is a bit messy, am still playing around).

// 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();

Edit: I would like to know the data structure/query method that will allow me to return all events in the events collection that are on now or that will start in the next month. Additionally, I would like the query to exclude events that have already finished. Each document (event) has a startDate and endDate timestamp on it.

like image 262
Eli Avatar asked Oct 24 '25 14:10

Eli


2 Answers

Since you have two fields to check with ranges, I'm not sure this is doable with a single query. What you can do instead is perform two queries, merge the results on the client, and perform a final filter to get the exact matches.

  1. Make an assumption about the maximum duration for an event. Call that amount of time "X".
  2. Query for all documents where startDate is greater than now - X, and also less than now + 30 days. Call this result set "A".
  3. Query for all documents where endDate is greater than now, and also less than now + 30 days. Call this result set "B".
  4. On the client, iterate all the results from A and B, checking to see if the start and end dates fit the criteria you want.

I can't think of a way to structure your data that will do this with a single query.

like image 170
Doug Stevenson Avatar answered Oct 27 '25 04:10

Doug Stevenson


I know this is kind a old thread, but the answer might be good for others.

What you can do as I at the end ended up doing, is that you have a $start_date and a $target_date.

You then do like this:

<?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);

?>

Not bad, eh? You welcome!

like image 23
Cooper Avatar answered Oct 27 '25 04:10

Cooper