Hola chicos, trato de obtener datos de un documento que tiene un nombre de valor de campo y una subcolección llamada kurzwaffensub
pero para mi proyecto necesito hacer una collectionGroup query
y luego necesito el Name value
de cada documento que coincida con la consulta de la subcolección. .
Así que déjame explicarte. Primero necesito hacer una collectionGroup query
de los documents
de la subcolección basada en sus dos parámetros kurzHersteller
y kurzModell
que marqué en verde en la imagen. Después de eso, obtengo todos los Documents
de cada Subcollection
que coinciden con la consulta.
Y como puede ver, el blue document uid
es el mismo uid
que en el valor de campo de cada documento de la subcolección.
Y mi objetivo es obtener el valor de campo marcado fieldvalue
de los documents
de la colección principal después de la consulta grupal de la subcollection
.
Pero solo quiero recibir los Nombres de los documents
que coincidan con los requisitos de la consulta.
Entonces, en este caso, necesito el nombre Felix Sturms
porque tiene un document
en su subcollection
marcado en amarillo que coincide con la búsqueda de kurzHersteller : Andere
y kurzKaliber : Andere
No sé si esto es posible o si necesito estructurar mis datos de otra manera. Soy un principiante con firebase firestore, así que tal vez puedas ayudarme.
const [test, setTest] = useState([]); const HEuKA = query(kurzRef,where("kurzHersteller", "==", `${kurzHersteller}` ), where('kurzKaliber' , '==', `${kurzKaliber}`)); const handleClick = async () => { ...blablabla ... } else if (kurzHersteller && kurzKaliber) { const modell = await getDocs(HeuKa); modell.forEach((doc) => { // doc.data() is never undefined for query doc snapshots setTest(doc.id, " => ", doc.data()); }); } else { alert('Bitte etwas eingeben')} }
Así que esa es la primera operación después de recibir la matriz de los documentos de la subcolección que coinciden con la consulta, necesito otra operación para obtener los documentos correspondientes de la colección principal que contienen la información sobre el Nombre de los usuarios que tienen un documento en el subcolección que coincide con los valores kurzHersteller: Andere
y kurzModell: Andere
de este ejemplo.
Una vez que obtenga la QuerySnapshot de su consulta de grupo de colección, puede recorrer cada documento y luego acceder al documento principal usando la propiedad .parent
presente en DocumentReference de cada documento. Intente ejecutar el siguiente código después de su primera consulta:
const modell = await getDocs(HeuKa); const data = []; for (const doc of modell.docs) { const parentDoc = await getDoc(doc.ref.parent.parent); const { Name } = parentDoc.data(); data.push({ ...doc.data(), Name, }); }
Firestore lee/consulta documentos devueltos de una sola colección, o con consultas de grupos de colección de todas las colecciones con el mismo nombre. No hay forma en Firestore de incluir datos del documento principal en la misma lectura/consulta.
Las dos opciones que tienes son:
Si bien el n.° 1 es la opción más común para las personas que son nuevas en Firestore (y en las bases de datos NoSQL en general), a medida que tenga más experiencia con Firestore, a menudo se encontrará usando el n.° 2 con mayor frecuencia.
Creo que una forma más robusta, en la que no depende de la estructura, es obtener el documento del campo 'uid' que tiene en cada documento que obtiene de la consulta'. Aún mejor sería cambiar este campo para escribir "referencia", en cuyo caso puede hacerlo (asumiendo que crea un campo llamado referencia de cliente como reemplazo de uid):
modell.forEach((doc) => { const customerDoc = await doc.data().customerReference.get(); const name = customerDoc.data().Name;