You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android(Kotlin)中如何获取Firestore跨集合关联的数组数据?

如何在Kotlin中获取Firebase Auth登录Manager的所有Turf详情

根据你的数据结构,有两种高效的实现方式,以下是具体代码和说明:

方案一:利用Turf文档的manager_id字段直接查询(推荐)

这种方式无需先查询Manager文档,直接通过turfs集合的manager_id字段过滤,是最简洁高效的实现方式:

import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.firestore.FirebaseFirestore
import kotlinx.coroutines.tasks.await

// 获取当前登录Manager的UID
val currentManagerUid = FirebaseAuth.getInstance().currentUser?.uid ?: return

// 初始化Firestore实例
val db = FirebaseFirestore.getInstance()

// 回调方式实现
db.collection("turfs")
    .whereEqualTo("manager_id", currentManagerUid)
    .get()
    .addOnSuccessListener { querySnapshot ->
        val turfsList = mutableListOf<Turf>()
        for (document in querySnapshot) {
            val turf = document.toObject(Turf::class.java)
            turfsList.add(turf)
        }
        // 在此处处理获取到的Turf列表(如更新UI)
    }
    .addOnFailureListener { exception ->
        // 处理查询失败逻辑
        exception.printStackTrace()
    }

// Coroutines方式(推荐在ViewModel/Repository中使用)
suspend fun getCurrentManagerTurfs(): List<Turf>? {
    return try {
        val currentManagerUid = FirebaseAuth.getInstance().currentUser?.uid ?: return null
        val querySnapshot = db.collection("turfs")
            .whereEqualTo("manager_id", currentManagerUid)
            .get()
            .await()
        querySnapshot.toObjects(Turf::class.java)
    } catch (e: Exception) {
        e.printStackTrace()
        null
    }
}

方案二:通过Manager文档的turfs_owned数组查询

如果需要基于turfs_owned数组获取Turf数据,可先查询Manager文档拿到UID列表,再用whereIn查询turfs集合:

import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.firestore.FieldPath
import com.google.firebase.firestore.FirebaseFirestore
import kotlinx.coroutines.tasks.await

// 初始化Firestore实例
val db = FirebaseFirestore.getInstance()

// Coroutines方式实现
suspend fun getCurrentManagerTurfsFromOwnedList(): List<Turf>? {
    return try {
        val currentManagerUid = FirebaseAuth.getInstance().currentUser?.uid ?: return null
        
        // 第一步:获取当前Manager的turfs_owned数组
        val managerDoc = db.collection("manager").document(currentManagerUid).get().await()
        val turfsOwnedUids = managerDoc.get("turfs_owned") as? List<String> ?: emptyList()
        
        if (turfsOwnedUids.isEmpty()) return emptyList()
        
        // 第二步:查询turfs集合中UID在列表内的文档
        // 注意:Firestore的whereIn最多支持10个元素,超过需分批查询
        val querySnapshot = db.collection("turfs")
            .whereIn(FieldPath.documentId(), turfsOwnedUids)
            .get()
            .await()
        
        querySnapshot.toObjects(Turf::class.java)
    } catch (e: Exception) {
        e.printStackTrace()
        null
    }
}

关键注意事项

  • 权限配置:必须在Firestore安全规则中限制访问,确保用户仅能读取自己的Turf数据,示例规则:
    match /turfs/{turfId} {
      allow read: if request.auth != null && resource.data.manager_id == request.auth.uid;
    }
    
  • 数据类定义:需定义Turf数据类映射Firestore文档,示例:
    data class Turf(
        val manager_id: String = "",
        val name: String = "",
        val location: String = ""
        // 其他Turf字段按需添加
    )
    
  • whereIn限制:方案二中whereIn最多支持10个元素,若turfs_owned数组长度超过10,需拆分列表分批查询后合并结果。

内容的提问来源于stack exchange,提问作者Soumil Jaiswal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 07:32:03