Firestore soporta varias operaciones avanzadas como filtros múltiples, ordenamiento, paginación y operaciones en arrays. Veamos cómo implementarlas.
Consulta Básica
firestore.collection("users")
.whereEqualTo("age", 25)
.get()
.addOnSuccessListener { documents ->
for (document in documents) {
Log.d("Firestore", "${document.id} => ${document.data}")
}
}
.addOnFailureListener { e ->
Log.e("Firestore", "Error fetching documents", e)
}
Filtros Múltiples
Es posible combinar varios filtros en una consulta usando where
:
firestore.collection("users")
.whereEqualTo("country", "USA")
.whereGreaterThan("age", 18)
.get()
.addOnSuccessListener { documents ->
for (document in documents) {
Log.d("Firestore", "${document.id} => ${document.data}")
}
}
Nota: Todos los filtros deben cumplir las restricciones de índices compuestos en Firestore.
Ordenar Resultados
Usa orderBy
para ordenar los datos por un campo:
firestore.collection("users")
.orderBy("age", Query.Direction.DESCENDING)
.get()
.addOnSuccessListener { documents ->
for (document in documents) {
Log.d("Firestore", "${document.id} => ${document.data}")
}
}
Paginación
La paginación permite manejar grandes conjuntos de datos:
var lastVisibleDocument: DocumentSnapshot? = null
fun fetchFirstPage() {
firestore.collection("users")
.orderBy("age")
.limit(10)
.get()
.addOnSuccessListener { documents ->
if (documents.size() > 0) {
lastVisibleDocument = documents.documents.last()
for (document in documents) {
Log.d("Firestore", "${document.id} => ${document.data}")
}
}
}
}
fun fetchNextPage() {
lastVisibleDocument?.let {
firestore.collection("users")
.orderBy("age")
.startAfter(it)
.limit(10)
.get()
.addOnSuccessListener { documents ->
if (documents.size() > 0) {
lastVisibleDocument = documents.documents.last()
for (document in documents) {
Log.d("Firestore", "${document.id} => ${document.data}")
}
}
}
}
}
Operaciones con Arrays
Firestore permite consultar elementos en arrays con:
array-contains
: Para buscar un valor específico.
array-contains-any
: Para buscar valores dentro de un conjunto.
Ejemplo:
firestore.collection("posts")
.whereArrayContains("tags", "kotlin")
.get()
.addOnSuccessListener { documents ->
for (document in documents) {
Log.d("Firestore", "${document.id} => ${document.data}")
}
}
firestore.collection("posts")
.whereArrayContainsAny("tags", listOf("kotlin", "firebase"))
.get()
.addOnSuccessListener { documents ->
for (document in documents) {
Log.d("Firestore", "${document.id} => ${document.data}")
}
}
Combinar Filtros y Orden
Cuando usas múltiples filtros con orderBy
, asegúrate de que todos los campos estén indexados:
firestore.collection("products")
.whereGreaterThanOrEqualTo("price", 10)
.orderBy("price", Query.Direction.ASCENDING)
.get()
.addOnSuccessListener { documents ->
for (document in documents) {
Log.d("Firestore", "${document.id} => ${document.data}")
}
}
Optimización de Queries
Usa índices compuestos: En el panel de Firebase, agrega índices para consultas complejas.
Evita consultas que descarguen muchos documentos: Usa límites con .limit(n)
.
Minimiza los campos devueltos: Usa .select()
para seleccionar solo los campos necesarios:
firestore.collection("users")
.select("name", "age")
.get()
Última actualización