简体   繁体   中英

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.

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.

From the docs:

You can only perform range comparisons (<, <=, >, >=) on a single field, and you can include at most one array-contains or array-contains-any clause in a compound query:

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

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

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!

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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