Sé que no hay un "O" lógico real en las consultas de Firestore. Es por eso que generalmente hago dos consultas separadas y combino los resultados en el lado del cliente.
Sin embargo, necesito agregar paginación ahora. Para la paginación, la combinación de los resultados de Firestore en el lado del cliente obviamente no funcionará.
EDITAR: Más información sobre mi esquema de base de datos:
// Collection: 'items' doc-id-1 provider_id: 'ABCDE' company_id: 'FGHIJ' doc-id-2 provider_id: 'KLMNO' company_id: 'ABCDE' doc-id-3 provider_id: 'ABCDE' company_id: 'ABCDE' doc-id-4 provider_id: 'KLMNO' company_id: 'KLMNO'Aquí está mi ejemplo:
// Get items by provider db_query = this.db.collection('items').ref .where('provider_id', '==', 'ABCDE'); // OR // Get items by company db_query = this.db.collection('items').ref .where('company_id', '==', 'ABCDE'); /* Combining the queries above with a logical OR should return the following documents (from my database scheme further up): - doc-id-1 - doc-id-2 - doc-id-3 */ Necesito combinar estas consultas (obtener items , donde provider_id O company_id tiene un valor dado).
Mi paginación funciona de la siguiente manera (enfoque predeterminado en Firestore):
// Query type (init, next page, prev page, fallback) if (query_type == 'init') { db_query = db_query.limit(limit); } else if (query_type == 'next') { db_query = db_query.startAfter(last_in_response).limit(limit); } else if (query_type == 'prev') { db_query = db_query.endBefore(first_in_response).limitToLast(limit); } else { db_query = db_query.limit(limit); }¿Hay alguna forma de resolver esto? Si aún combino los resultados en el lado del cliente, mis cursores de paginación no serán correctos. Por lo tanto, necesito conectar en cascada la consulta de alguna manera, pero no puedo encontrar el enfoque correcto para eso.
¡Gracias de antemano por cualquier pista!
Necesito combinar estas consultas (obtener
items, dondeprovider_idOcompany_idtiene un valor dado).
En su caso específico (es decir, buscar todos los documentos en la misma colección de items donde provider_id o company_id equivalen al mismo valor) podría desnormalizar sus datos y, por ejemplo, tener un campo adicional provider_company_ids de tipo matriz, con dos elementos. El primer elemento tendrá el valor de provider_id y el segundo elemento tendrá el valor de company_id .
Entonces puede usar el operador array-contains de la siguiente manera:
db_query = this.db.collection('items').ref .where("provider_company_ids", "array-contains", "ABCDE");y podrá paginar correctamente ya que ahora es una sola consulta.
Actualice después de su comentario agregado debajo de su pregunta:
Después de implementar la solución anterior, sus documentos se verán de la siguiente manera:
// Collection: 'items' doc-id-1 provider_id: 'ABCDE' company_id: 'FGHIJ' provider_company_ids: ['ABCDE', 'FGHIJ'] // New field of type array doc-id-2 provider_id: 'KLMNO' company_id: 'ABCDE' provider_company_ids: ['KLMNO', 'ABCDE'] doc-id-3 provider_id: 'ABCDE' company_id: 'ABCDE' provider_company_ids: ['ABCDE', 'ABCDE'] doc-id-4 provider_id: 'KLMNO' company_id: 'KLMNO' provider_company_ids: ['KLMNO', 'KLMNO'] PD: no estoy seguro de cuál es la propiedad ref en su código ( db_query = this.db.collection('items').ref.where('provider_id', '==', 'ABCDE'); ). Lo reutilicé como tal en mi respuesta, asumiendo que this.db.collection('items').ref devuelve una Query .