Estoy tratando de obtener todos los documentos en todas las subcolecciones con Firebase V9, así que usé collectionGroup para recuperar los datos.
Aquí está mi arquitectura de Firestore:
bots (collection) | id (doc ID) | order_history (sub collection) | id (doc ID) createdBy: uid (user uid)
Y así es como trato de obtener documentos:
const [orders, setOrders] = useState([]); const { user } = useAuth(); const getOrders = async () => { const orders = await getDocs(query(collectionGroup(db, 'order_history'), where('createdBy', '==', user.uid))); setOrders(orders.docs.map((doc) => ({ ...doc.data() }))) } useEffect(() => { getOrders(); console.log('orders ', orders); // return [] }, []);
Este código devuelve una matriz vacía.
¿Hice algo mal?
La ejecución de su método anónimo getOrders requiere una declaración de devolución explícita si hay más de 1 declaración. Las devoluciones implícitas funcionan cuando solo existe una declaración (y después de algunas pruebas, return await X
tampoco parece funcionar).
const getOrders = async () => { const orders = await getDocs(...); setOrders(orders.docs.map(...)) }
Necesita ser
const getOrders = async () => { const orders = await getDocs(...); return setOrders(orders.docs.map(...)) }
Creo que su función getOrders
es una función asíncrona. Si desea un log
depuración, creo que debería esperar a que se completed
los orders
y luego se actualizaron los pedidos.
Ex:
useEffect(() => { console.log('orders ', orders); }, [orders]);