firebase - from - firestore query
Firestore obtiene todos los documentos y subcolecciones de la colección raíz (3)
Di que tengo este tipo de estructura
A (collection): {
a (doc): {
name:''Tim'',
B (collection):{
b (doc): {
color:''blue''
}
}
}
}
donde A
y B
son colecciones, mientras que a
y b
son documentos .
¿Hay una manera de obtener todo lo contenido en un documento raíz con una consulta?
Si pregunto asi
db.collection("A").doc("a").get()
Acabo de recibir el name:''Tim''
campo name:''Tim''
. Lo que quiero es también obtener todos los documentos de B.
Básicamente deseo que devuelva mi consulta
{
user:''Tim'',
B (collection):{
b (doc): {
color:''blue''
}
}
}
¿Es posible o realmente necesito hacer varias consultas una para cada colección: /?
Digamos que tengo un árbol de colecciones anidado muy profundo que representa el perfil de usuario, mis costos aumentarán muchísimo ya que cada vez que cargue un perfil de usuario tengo un multiplicador de solicitudes de lectura 1 x N
donde N es la profundidad de mi árbol: /.
Agregando a la respuesta de Matt R, si está usando babel o puede usar async / await, puede obtener el mismo resultado con menos código (sin catch
/ then
):
// Get reference to all of the documents
console.log("Retrieving list of documents in collection");
let documents = await collectionRef.get();
documents.forEach(async doc => {
console.log("Parent Document ID: ", doc.id);
let subCollectionDocs = await collectionRef.doc(doc.id).collection("subCollection").get()
subCollectionDocs.forEach(subCollectionDoc => {
subCollectionDoc.forEach(doc => {
console.log("Sub Document ID: ", doc.id);
})
});
Como sabemos, la consulta en Cloud Firestore es superficial por defecto. Este tipo de consulta no es compatible, aunque es algo que Google podría considerar en el futuro.
Si le preocupan los costos de cada extracción, deberá estructurar sus datos de acuerdo con sus necesidades comunes de visualización / extracción, en lugar de lo que podría preferir para una estructura perfecta. Si necesita juntar estas cosas cada vez, considere usar "mapas" para cosas que en realidad no necesitan ser subcolecciones con documentos.
En este ejemplo, "preferencias" es un mapa.
{
user: "Tim",
preferences: {
color: "blue",
nickname: "Timster"
}
}
Cada documento también tiene un tamaño limitado de 1 MB, por lo que si necesita almacenar algo para este usuario que pueda escalar y seguir creciendo, como los registros, entonces sería lógico dividir los registros en una subcolección que solo se extrae cuando lo desea, haciendo que cada entrada de registro sea un documento separado ... Y si todos los registros para todos los usuarios se almacenan en una colección principal separada, o si la subcolección de cada usuario realmente depende de cómo extraerá los registros y de lo que resultará En velocidades rápidas, equilibrado contra costes de tirones. Si le está mostrando a este usuario sus últimas 10 búsquedas, entonces un registro de búsqueda tendría sentido como una subcolección. Si está extrayendo todos los datos de búsqueda para todos los usuarios para su análisis, entonces una recopilación de nivel padre por separado tendría sentido porque puede extraer todos los registros en 1 tirón, para evitar la necesidad de extraer los registros de cada usuario por separado.
También puede anidar sus tirones y promesas juntos por motivos de conveniencia.
// Get reference to all of the documents
console.log("Retrieving list of documents in collection");
let documents = collectionRef.limit(1).get()
.then(snapshot => {
snapshot.forEach(doc => {
console.log("Parent Document ID: ", doc.id);
let subCollectionDocs = collectionRef.doc(doc.id).collection("subCollection").get()
.then(snapshot => {
snapshot.forEach(doc => {
console.log("Sub Document ID: ", doc.id);
})
}).catch(err => {
console.log("Error getting sub-collection documents", err);
})
});
}).catch(err => {
console.log("Error getting documents", err);
});