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

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

{
  start: March 5
  end: April 7
}

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

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

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

Это вообще возможно?


person Jus10    schedule 26.03.2019    source источник
comment
Это возможно в Firestore, но, пожалуйста, добавьте снимок экрана с вашей реальной базой данных.   -  person Alex Mamo    schedule 26.03.2019


Ответы (2)


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

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.
                    }
                }
            });
person Haji Fernandez    schedule 02.11.2019
comment
Добро пожаловать в SO! Отвечая на вопрос, пожалуйста, прокомментируйте его. В этом случае есть другой ответ, поэтому вам следует раскрыть плюсы своего ответа. - person David García Bodego; 02.11.2019

Просто используйте этот запрос меньше и больше. Например, в моем приложении 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();
    }

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

person Abhi    schedule 12.04.2019