Estoy tratando de voltear mis documentos de instantáneas de consulta, pero no sucede nada:
export async function getUserPosts( userId, getOldPosts = true, startAfter, limit = MAX_USER_POSTS_TO_RETRIEVE ) { ... const query = userPostsRef .orderBy("date", getOldPosts ? "desc" : "asc") .startAfter(startAfter); const querySnapshot = await query.limit(limit).get(); if(!getOldPosts) { console.log("=== BEFORE ==="); querySnapshot.docs.forEach((prev) => { console.log(prev.data().date.toDate()); }); // Flip the docs if we are fetching new posts querySnapshot.docs.reverse(); <----- console.log("=== AFTER FLIP ==="); querySnapshot.docs.forEach((prev) => { console.log(prev.data().date.toDate()); }); } ... }Cuando acabo de llamar a mi método así:
getUserPosts("...", false, new Date()); // will execute an orderBy("date", "asc")La consola registra los siguientes datos:
=== BEFORE === 2021-11-08T20:57:31.382Z // (oldest) 2021-11-08T20:57:32.816Z 2021-11-08T20:57:36.130Z // (most recent) === AFTER FLIP === 2021-11-08T20:57:31.382Z // (oldest) 2021-11-08T20:57:32.816Z 2021-11-08T20:57:36.130Z // (most recent)Como puede ver, los documentos no están volteados... Espero obtener
=== AFTER FLIP === 2021-11-08T20:57:36.130Z // (most recent) 2021-11-08T20:57:32.816Z 2021-11-08T20:57:31.382Z // (oldest)como resultado de la operación, y no entiendo por qué esto no funciona si el siguiente código sí lo hace:
const querySnapshot = { docs: [ { data: () => ({ timestamp: 1 }) }, { data: () => ({ timestamp: 2 }) } ] } // Before flipping: [1, 2] querySnapshot.docs.reverse(); // Expected: [2, 1] querySnapshot.docs.forEach((doc) => { console.log(doc.data().timestamp) })La propiedad QuerySnapshot.docs se calcula y devuelve una nueva matriz cada vez que la llama. Su implementación :
/** An array of all the documents in the `QuerySnapshot`. */ get docs(): Array<QueryDocumentSnapshot<T>> { const result: Array<QueryDocumentSnapshot<T>> = []; this.forEach(doc => result.push(doc)); return result; } Entonces, su llamada reverse() invierte una matriz efímera, mientras que su llamada posterior a querySnapshot.docs luego devuelve una nueva matriz en el orden de la base de datos.
Para solucionar este problema, almacene una referencia a los documentos cuando los obtenga por primera vez de QuerySnapshot.docs e invierta eso :
console.log("=== BEFORE ==="); let docs = querySnapshot.docs; docs.forEach((prev) => { console.log(prev.data().date.toDate()); }); // Flip the docs if we are fetching new posts docs.reverse(); <----- console.log("=== AFTER FLIP ==="); docs.forEach((prev) => { console.log(prev.data().date.toDate()); });