#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();
}
Что касается дат, вы можете фактически получить дату из системы или принять входные данные от пользователя и настроить их в соответствии с вашими потребностями. Дайте мне знать, если вам понадобится какая-либо помощь.