Estoy creando una aplicación de tareas completas usando firebase para almacenar información del usuario. Mi idea es que cada usuario pueda crear varias listas y escribir varias tareas pendientes en cada lista (por ejemplo, tener una lista para hoy y otra para mañana). Mis datos están estructurados de esta manera:
usuarios (colección) -> IDusuarios (cada usuario es un documento) -> Listas de todos (colección) -> todoId (documento) -> (objeto con los datos)
Parece que no puedo consultar las múltiples listas que un usuario podría tener (de manera predeterminada, actualmente solo estoy recuperando datos de la colección 'todos'). O no puedo ver alguna funcionalidad de Firestore o no estoy estructurando mi base de datos correctamente. ¿Algún consejo?
Estás estructurando bien tus datos. El problema es que Firebase Client SDK
no ofrece una función para recuperar todas las subcolecciones que tiene un documento. Para resolver tu problema tienes múltiples opciones.
1. La forma más limpia pero exhaustiva
Actualiza al Plan Blaze y usa Firebase Functions con Admin SDK. Admin SDK ofrece una función llamada listCollections()
que hace exactamente lo que desea. La desventaja es que las funciones de Firebase tienen algo llamado coldstart
en frío, lo que significa que cuando su función estuvo inactiva durante algunos minutos, tarda hasta 20 segundos (según mi experiencia) en volver a ejecutarse después de llamarla, lo que puede ser realmente frustrante. De lo contrario, puede ejecutar un servidor node.js gratuito en algo como Heroku para usar el SDK de administrador allí para evitar el arranque en frío (mejor opción en mi opinión). El SDK de administrador no está destinado explícitamente a ser utilizado en el lado del cliente. Revisa este hilo
2. Haga una lista de todas sus listas de tareas pendientes (la forma más fácil)
Cada vez que el usuario crea una nueva lista, la agrega a una matriz en su documento de usuarios como esta:
// Representation of your user document user name: "Florian" lists: [ "todos", "anotherList" ]
Entonces, de esa manera, puede buscar a su usuario, obtener la propiedad de las listas y llamar a todas las listas con un bucle sobre la matriz de lists
. Como alternativa, simplemente muestre el contenido de las lists
y deje que el usuario lo abra explícitamente para guardar las lecturas.
3. Reestructurar su base de datos (lo recomendaría)
Si aún no tiene muchos datos, le recomendaría reestructurar su base de datos de la siguiente manera:
users - the collection with all your users (without the todo list subcollections lists - containing a document for every created list - each document contains a field with `owner` - each document contains a field with the list name - each document owns a subcollection with todos
Si usa esta forma, podría consultar la base de datos como
const getLists = async () => { const ref = collection(db, 'lists'); const q = query(ref, where('owner', '==', theUserYouWantToQuery); // returns array with all list (including listname) of that user. const lists = (await getDocs(q)).docs.map(doc => ({ ...doc.data(), doc.id })); }
cuando tiene todos los objetos de lista de ese usuario, puede recorrer esa matriz para obtener todos en las listas o dejar que el usuario solo busque una lista abriéndola