firebase - from - Google Firestore: ¿cómo obtener documentos por múltiples ID en un solo viaje de ida y vuelta?
firestore get document id (7)
¿Seguramente la mejor manera de hacerlo es implementando la consulta real de Firestore en una función de nube? Entonces solo habría una sola llamada de ida y vuelta desde el cliente a Firebase, que parece ser lo que está pidiendo.
Realmente desea conservar toda su lógica de acceso a datos como este lado del servidor de todos modos.
Internamente es probable que haya la misma cantidad de llamadas a Firebase, pero todas se realizarían a través de las interconexiones súper rápidas de Google, en lugar de a través de la red externa, y combinadas con la canalización que Frank van Puffelen ha explicado, debería obtener un excelente rendimiento de Este enfoque.
Me pregunto si es posible obtener varios documentos por lista de identificadores en un solo viaje de ida y vuelta (llamada de red) a Firestore.
En la práctica, usarías firestore.getAll like this
async getUsers({userIds}) {
const refs = userIds.map(id => this.firestore.doc(`users/${id}`))
const users = await this.firestore.getAll(...refs)
console.log(users.map(doc => doc.data()))
}
o con sintaxis prometedora
getUsers({userIds}) {
const refs = userIds.map(id => this.firestore.doc(`users/${id}`))
this.firestore.getAll(...refs).then(users => console.log(users.map(doc => doc.data())))
}
Esto no parece ser posible en Firestore en este momento. No entiendo por qué se acepta la respuesta de Alexander, la solución que propone simplemente devuelve todos los documentos de la colección de "usuarios".
Dependiendo de lo que necesite hacer, debe buscar duplicar los datos relevantes que necesita mostrar y solo solicitar un documento completo cuando sea necesario.
Lo mejor que puede hacer es
no
usar
Promise.all
ya que su cliente debe esperar
.all
las lecturas antes de continuar.
Itere las lecturas y deje que se resuelvan de forma independiente.
En el lado del cliente, esto probablemente se reduce a la interfaz de usuario que tiene varias imágenes del cargador de progreso resueltas en valores de forma independiente.
Sin embargo, esto es mejor que congelar todo el cliente hasta que se resuelvan
.all
las lecturas.
Por lo tanto, descargue todos los resultados síncronos en la vista inmediatamente, luego deje que los resultados asíncronos entren a medida que se resuelven, individualmente. Esto puede parecer una pequeña distinción, pero si su cliente tiene una conectividad a Internet deficiente (como la que tengo actualmente en esta cafetería), congelar toda la experiencia del cliente durante varios segundos probablemente resulte en una experiencia de ''esta aplicación apesta''.
No, en este momento no hay forma de agrupar múltiples solicitudes de lectura utilizando el SDK de Cloud Firestore y, por lo tanto, no hay forma de garantizar que pueda leer todos los datos a la vez.
Sin embargo, como Frank van Puffelen ha dicho en los comentarios anteriores, esto no significa que recuperar 3 documentos será 3 veces más lento que recuperar un documento. Es mejor realizar sus propias mediciones antes de llegar a una conclusión aquí.
Podrías usar una función como esta:
function getById (path, ids) {
return firestore.getAll(
[].concat(ids).map(id => firestore.doc(`${path}/${id}`))
)
}
Se puede llamar con una sola ID:
getById(''collection'', ''some_id'')
o una matriz de ID:
getById(''collection'', [''some_id'', ''some_other_id''])
si estás dentro del nodo:
https://github.com/googleapis/nodejs-firestore/blob/master/dev/src/index.ts#L701
/**
* Retrieves multiple documents from Firestore.
*
* @param {...DocumentReference} documents - The document references
* to receive.
* @returns {Promise<Array.<DocumentSnapshot>>} A Promise that
* contains an array with the resulting document snapshots.
*
* @example
* let documentRef1 = firestore.doc(''col/doc1'');
* let documentRef2 = firestore.doc(''col/doc2'');
*
* firestore.getAll(documentRef1, documentRef2).then(docs => {
* console.log(`First document: ${JSON.stringify(docs[0])}`);
* console.log(`Second document: ${JSON.stringify(docs[1])}`);
* });
*/