В настоящее время я запрашиваю коллекцию по ссылке Firestore:
val missionsCollection = FirebaseFirestore.getInstance()
.collection("/customers").document(user.customerId).collection("missions")
.orderBy("deadline")
.whereGreaterThanOrEqualTo("deadline", startDate)
.whereLessThanOrEqualTo("deadline", endDate)
.whereArrayContains("staffs", user.id)
Просто чтобы прояснить ситуацию, в моем документе миссии поля соответственно:
крайний срок: метка времени
сотрудники: массив строк с идентификаторами сотрудников
Сейчас я получаю все миссии за определенный период времени (в зависимости от крайнего срока), принадлежащие определенному персоналу.
Но теперь мне также нужно получить миссии, которые видны всем сотрудникам (используя одно и то же правило крайнего срока), что в этом приложении означает все миссии, где этот массив пуст.
Поскольку у меня нет метода с именем .whereArrayIsEmpty("staffs"), я создал в своем документе поле с именем "visibleToAllStaffs", которое является логическим полем, но у меня есть более глубокая проблема. Firebase не разрешает оператор ИЛИ.
Я знаю, что могу вызвать первый запрос и, при его успешном обратном вызове, вызвать второй, но я хотел бы использовать что-то лучше, чем это, возможно, RxJava или Coroutines, но я застрял на том, как я мог это сделать.
Итак, мои вопросы:
1) Есть ли собственный способ (используя только firebase) для группировки двух запросов, которые извлекают данные из одной и той же коллекции, имея только один обратный вызов для ошибки и один для успеха (где, в этом случае, успех принесет обе данные)?
2) Если нет, могу ли я решить это с помощью RxJava или Coroutines? Как?
РЕДАКТИРОВАТЬ
Просто дам еще несколько объяснений, мой второй звонок будет:
val missionsCollection = FirebaseFirestore.getInstance()
.collection("/customers").document(user.customerId).collection("missions")
.orderBy("deadline")
.whereGreaterThanOrEqualTo("deadline", startDate)
.whereLessThanOrEqualTo("deadline", endDate)
.whereEqualTo("visibleToAllStaffs", true)
Переменные missionsCollection – это объекты типа Query. Для этих объектов я могу вызвать метод get(), который возвращает Задача объекта QuerySnapshot (Task<QuerySnapshot>)
С помощью этого объекта Task<QuerySnapshot> я могу добавить некоторые обратные вызовы (например, успех и ошибка), например:
missionsCollection.get().addOnSuccessListener { documentSnapshot ->
val missions = documentSnapshot.map { it.toObject(Mission::class.java) }
// do something with the list
}.addOnFailureListener {
// Do something
}
Моя самая большая проблема с сопрограммами заключалась в попытке объединить обратные вызовы, потому что я думаю, что у меня будет что-то вроде этого:
.merge(getMissionsCollection(), getSecondMissionsCollection())
.addOnSuccessListener { documentSnapshot ->
val missionsFromBothCalls = documentSnapshot.map { it.toObject(Mission::class.java) }
// do something with the full list
}.addOnFailureListener {
// Do something
}
но я не смог найти такого примера, как этот (где методы возвращают «наблюдаемый», а не нужный мне список, и я застрял в том, как объединить их вместе.