Entonces encontré esta respuesta que permite limitar la consulta de collectionGroup a un documento específico: CollectionGroupQuery pero limita la búsqueda a subcolecciones en un documento en particular
Sin embargo, también quiero filtrar aún más los resultados en función de un campo específico usando where , que requiere un índice. La consulta funciona sin errores, pero siempre devuelve una instantánea vacía:
const cityRef = firebase.firestore().doc('cities/cityId'); firebase.firestore().collectionGroup('attractions') .where('name', '>=', keywords), .where('name', '<=', keywords + '\uf8ff') .orderBy('name') .orderBy(firebase.firestore.FieldPath.documentId()) .startAt(cityRef.path), .endAt(cityRef.path + "\uf8ff") .get() .then((querySnapshot) => { console.log("Found " + querySnapshot.size + " docs"); querySnapshot.forEach((doc) => console.log("> " + doc.ref.path)) }) .catch((err) => { console.error("Failed to execute query", err); })base de fuego aquí
Es casi seguro que el problema es que su consulta tiene comprobaciones de rango en dos campos diferentes ( name y ruta del documento), lo que no es posible en el modelo de consulta de Firestore. Como dice la documentación sobre las limitaciones de consulta :
En una consulta compuesta, las comparaciones de rango (<, <=, >, >=) y no igual (!=, no incluido) deben filtrarse en el mismo campo.
Sus cláusulas startAt y endAt son solo formas diferentes de escribir > y < en lo que respecta a esta limitación.
Para entender por qué el SDK te permite escribir esta consulta, pero no te da el resultado que deseas, tendremos que profundizar un poco más, así que... 👇
Lo que es posible es pasar todos los campos relevantes a startAt y endAt para que pueda determinar la división correcta en todos esos valores de campo.
Hacer eso también eliminaría la necesidad de tener el where , por lo que sería:
firebase.firestore().collectionGroup('attractions') .orderBy('name') .orderBy(firebase.firestore.FieldPath.documentId()) .startAt(keywords, cityRef.path), .endAt(keywords + '\uf8ff', cityRef.path + "\uf8ff") .get() ... Pero esta consulta ahora primero busca los documentos que comienzan con keywords y luego, si es necesario cityRef.path allí para eliminar la ambigüedad entre múltiples resultados.
Lo que quieres es el equivalente de esta consulta:
const docId = firebase.firestore.FieldPath.documentId()l firebase.firestore().collectionGroup('attractions') .orderBy('name') .where('name', '>=', keywords), .where('name', '<=', keywords + '\uf8ff') .orderBy(firebase.firestore.FieldPath.documentId()) .where(docId, '>=', cityRef.path), .where(docId, '<=', cityRef.path + '\uf8ff')Ahora queda inmediatamente claro por qué esto no es posible, porque tenemos condiciones de rango en dos campos.
He estado tratando de hacer que funcione en este jsbin ( https://jsbin.com/yiyifin/edit?js,console ), hasta ahora sin éxito, pero volveré a publicar si lo hago funcionar o tengo una final. veredicto de por qué no funciona.