【发布时间】:2019-05-16 11:48:14
【问题描述】:
我目前正在 Firestore 上查询一个集合链接这个:
val missionsCollection = FirebaseFirestore.getInstance()
.collection("/customers").document(user.customerId).collection("missions")
.orderBy("deadline")
.whereGreaterThanOrEqualTo("deadline", startDate)
.whereLessThanOrEqualTo("deadline", endDate)
.whereArrayContains("staffs", user.id)
为了澄清一下,在我的任务文件中,这些字段分别是:
截止日期:时间戳
staffs:一个带有staff id的字符串数组
所以我目前正在获取的是属于某个员工的某个时间段(基于截止日期)的所有任务。
但是现在,我还必须获取所有员工都可以看到的任务(使用相同的截止日期规则),在这个应用程序中,这意味着 此数组为空的所有任务。
由于我没有名为.whereArrayIsEmpty("staffs") 的方法,因此我在文档上创建了一个名为“visibleToAllStaffs”的字段,这是一个布尔字段,但我有一个更深层次的问题。 Firebase 不允许使用 OR 语句。
我知道我可以调用第一个查询,并在它的成功回调上调用第二个查询,但我想使用比这更好的东西,也许是 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 对象(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
}
但我找不到任何像这样的示例(其中方法返回“可观察”而不是我需要的列表,我陷入了如何将它们合并在一起。
【问题讨论】:
标签: android google-cloud-firestore rx-java reactive-programming kotlin-coroutines