android Firestore查询来检查id是否在集合中,然后在单个查询中转到子集合

67up9zun  于 2023-04-18  发布在  Android
关注(0)|答案(1)|浏览(83)

我有一个firestore,有两个根集合,propertiesusers。每个属性都有一个“huurders”列表,这些列表只是userId的,还有一个房间的子集合,每个房间都有一个包含UserId的“huurder”字段。
我试图得到一个所有房间的列表,其中“huurder”字段等于给定的id。现在我只是检查“huurders”是否包含我要查找的UserId,但我正在努力如何进入子集合房间。
这是我的职责

override fun getRentedRoomsByUserInFirestore(userId: String): Flow<RoomsResponse> = callbackFlow {
    val snapshotListener = dbRef.collection("properties").whereArrayContains("huurders", userId).addSnapshotListener() { snapshot, e ->
        val roomsResponse = if (snapshot != null) {
            val rooms = snapshot.toObjects(Room::class.java)
            Response.Success(rooms)
        } else {
            Response.Failure(e)
        }
        trySend(roomsResponse)
    }
    awaitClose { snapshotListener.remove()
}
}

这是不正确的,因为这只会返回一个属性列表,其中UserId在数组'huurders'中。我需要深入一层并获取房间。我的firestore将被链接为图像。

f0brbegy

f0brbegy1#

Firestore查询总是返回您查询的文档。它们不能返回嵌套集合中的文档或链接数据。
因此,如果你想从数据库中获取一个房间列表,你需要查询rooms子集合。要查询所有名为rooms的集合,你可以使用集合组查询。因为你似乎在每个rooms文档中都有一个huurder字段,你应该能够通过以下方式获得正确的结果:

dbRef.collectionGroup("rooms").whereEqualTo("huurder", userId)

这将为您提供rooms文档快照的列表。
如果你想在这些结果中找到特定DocumentSnapshot的属性,你可以得到它的DocumentReference,然后检查其父节点的父节点。

相关问题