Android中是否有对应Node.js的Firestore getAll等价方法?
Android Firestore 中对应 Node.js
getAll() 的等价方法 当然有啦!在Android Firestore里,我们可以通过两种主要方式实现类似Node.js getAll()的功能,用来批量获取从Algolia/Elasticsearch返回的ID列表对应的文档,同时还能满足你对实时数据的需求。
1. 用 whereIn() + get() 实现批量查询
这是最直接的替代方案,通过whereIn()指定文档ID列表,再调用get()一次性获取结果。代码示例如下:
// 假设这是从搜索服务拿到的文档ID列表 val targetDocIds = listOf("user_123", "post_456", "comment_789") val db = FirebaseFirestore.getInstance() val collectionRef = db.collection("your-target-collection") // 用FieldPath.documentId()指定查询文档ID val query = collectionRef.whereIn(FieldPath.documentId(), targetDocIds) // 执行查询并处理结果 query.get() .addOnSuccessListener { snapshot -> for (doc in snapshot) { Log.d("Firestore", "文档 ${doc.id} 数据: ${doc.data}") // 这里可以把数据映射到你的实体类 } } .addOnFailureListener { e -> Log.w("Firestore", "查询失败", e) }
注意:Firestore的
whereIn()有最多10个参数的限制,如果你的ID列表超过10个,需要把列表拆分成多个子列表(每个不超过10个ID),分多次查询后合并结果。
2. 并行批量获取单个文档(无数量限制)
如果你的ID列表很长(超过10个),或者需要单独处理每个文档是否存在的情况,可以用并行任务的方式逐个获取文档:
val targetDocIds = listOf("doc_a", "doc_b", "doc_c", /* 更多ID... */) val db = FirebaseFirestore.getInstance() val collectionRef = db.collection("your-collection") // 为每个ID创建一个获取文档的任务 val fetchTasks = targetDocIds.map { docId -> collectionRef.document(docId).get() } // 用Tasks.whenAllSuccess并行执行所有任务 Tasks.whenAllSuccess<DocumentSnapshot>(fetchTasks) .addOnSuccessListener { docs -> docs.forEach { doc -> if (doc.exists()) { Log.d("Firestore", "找到文档 ${doc.id}: ${doc.data}") } else { Log.d("Firestore", "文档 ${doc.id} 不存在") } } } .addOnFailureListener { e -> Log.w("Firestore", "批量获取失败", e) }
这个方法没有10个ID的限制,而且能分别处理每个文档的存在状态,灵活性更高。
实现实时数据监听
你提到需要类似Firestore的实时功能,不用Algolia InstantSearch的话,我们可以把上面的查询改成实时监听,用addSnapshotListener()替代get(),这样文档有更新时会自动收到通知:
val query = collectionRef.whereIn(FieldPath.documentId(), targetDocIds) query.addSnapshotListener { snapshot, error -> if (error != null) { Log.w("Firestore", "实时监听失败", error) return@addSnapshotListener } snapshot?.let { if (!it.isEmpty) { it.forEach { doc -> Log.d("Firestore", "实时更新: 文档 ${doc.id} 数据: ${doc.data}") // 在这里更新UI或处理最新数据 } } else { Log.d("Firestore", "没有匹配的文档") } } }
这样就能实时获取文档的变化,完全符合你对实时数据的需求。
内容的提问来源于stack exchange,提问作者Leze
相关产品推荐
相关产品推荐

