Диапазон дат запроса Firestore

#google-cloud-firestore #querying

#google-облако-firestore #выполнение запроса

Вопрос:

У меня есть диапазон дат в моих документах (с использованием объектов date) примерно так

 {
  start: March 5
  end: April 7
}
  

Я пытаюсь выяснить, как бы я построил запрос, чтобы возвращать все события, которые охватывают определенный день, например March 27 , so like….

Запрос, который говорит что-то вроде get all documents whose starting date is before march 27th, and the ending date is after march 27th , но похоже, что это может быть невозможно из-за ограничений запроса Firestore.

Итак, я часами ломал голову, чтобы либо создать запрос для этого, либо структурировать свои данные каким-либо образом, который позволил бы это.

Возможно ли это вообще?

Комментарии:

1. Это возможно в Firestore, но, пожалуйста, добавьте скриншот вашей реальной базы данных.

Ответ №1:

Приведенный выше код спасает мой день. Я знаю, что эта структура кода странная, но она работает. Это можно использовать для поиска диапазона дат, я надеюсь, это поможет!

 SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy hh:mm:ss");
    sdf.setTimeZone(TimeZone.getTimeZone("Asia/Manila"));
    Date newDate = null;
    Date newDate1 = null;
    try {
        newDate = sdf.parse(YOUR_EDIT_TEXT   " 00:00:00");
        newDate1 = sdf.parse(YOUR_EDIT_TEXT   " 23:59:59");
    } catch (ParseException e) {
        e.printStackTrace();
    }


    db.collection("sales")
            .whereGreaterThanOrEqualTo("created_at", newDate)
            .whereLessThan("created_at", newDate1)
            .get()
            .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                @Override
                public void onComplete(@NonNull Task<QuerySnapshot> task) {
                    for(final DocumentSnapshot sales: task.getResult()) {
                        // Do what ever you want with the data.
                    }
                }
            });
  

Комментарии:

1. Добро пожаловать в SO! Когда вы отвечаете на вопрос, пожалуйста, прокомментируйте его немного. В этом случае есть другой ответ, поэтому вы должны раскрыть плюсы своего ответа.

Ответ №2:

Просто используйте меньше и больше этого запроса. Например, в моем приложении Android for snapshot listener (прослушивание обновлений) я сделал что-то вроде этого:

     ListenerRegistration registration;
    String lessDate = "09/04/2019 23:59:59";
    String greaterDate = "11/04/2019 23:59:59";
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss", Locale.getDefault());
    try {
        Date lDate = dateFormat.parse(lessDate);
        Date gDate = dateFormat.parse(greaterDate);
        Query q = db.collection("collection").whereGreaterThan("createdAt", new Timestamp(lDate))
                .whereLessThan("createdAt", new Timestamp(gDate));
        registration = q.addSnapshotListener(new EventListener<QuerySnapshot>() {
            @Override
            public void onEvent(@Nullable QuerySnapshot value,
                                @Nullable FirebaseFirestoreException e) {
                if (e != null) {
                    Log.i("FIRESTORE ERROR", "Listen failed.", e);
                    return;
                }
                for (DocumentChange doc : value.getDocumentChanges()) {
                    // What ever you want to do.
                }
            }
        });
    } catch (ParseException e) {
        e.printStackTrace();
    }
  

Что касается дат, вы можете фактически получить дату из системы или принять входные данные от пользователя и настроить их в соответствии с вашими потребностями. Дайте мне знать, если вам понадобится какая-либо помощь.