正如您在firestore屏幕截图中看到的那样,我在用户集合中有两个用户,而在一个用户中,我已经参与了ChatChatChannels集合,因为聊天是针对一个用户开始的,而其他用户没有engageChatChannels
我想吸引所有参与了聊天频道的用户
我尝试了以下代码。我可以检查用户是否已订婚ChatChannel集合,但是我无法根据条件在mutableListOf中添加项目。我尝试通过删除条件,但没有添加项目。
fun addUsersListener(context: Context, onListen: (List<Item>)->Unit): ListenerRegistration{
return firestoreInstance.collection("users")
.addSnapshotListener { querySnapshot, firebaseFirestoreException ->
if(firebaseFirestoreException !=null){
return@addSnapshotListener
}
val items = mutableListOf<Item>()
querySnapshot?.documents?.forEach {
firestoreInstance.collection("users")
.document(it.id).collection("engagedChatChannels").get()
.continueWith { result->
Log.v("CHATS", "Exits" + result.result?.size())
if(result.result!!.size() > 0)
items.add(
UserItem(
it.toObject(User::class.java)!!,
it.id,
0,
context
)
)
}
}
onListen(items)
}
}
答案 0 :(得分:0)
在实际检查是否存在之前,您正在解雇0
。任何依赖于数据库数据的代码都必须在内部内,该数据可用时将触发该回调。
由于要执行多次检查,请考虑使用计数器检查所有检查是否都已完成:
let arr = [
[1, 2],
[10, 15],
[30, 40],
[-1, -50]
];
let newArr = [];
for (let x = 0; x < arr.length; x++) {
newArr.push(-Infinity); // populate it with `-Infinity`
for (let y = 0; y < arr[x].length; y++) {
if (newArr[x] < arr[x][y]) {
newArr[x] = arr[x][y];
}
}
}
console.log(newArr) // 2,15,40,-1
请注意,我没有运行上面的代码,因此它可能包含语法错误。但是,我希望流程很清楚,onListen(items)
调用位于回调内部,并且该计数器用于检查是否已完成所有子集合检查。
以上方法应该可行,但是我通常会采用另一种方法。如果您需要在用户级别上了解它们是否具有某个子集合,则可以将该事实存储在每个用户文档的字段中。这样,您可以简单地在用户文档中查询具有正确值的文档,并避免这种嵌套的循环/查询组合。