Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

277
Views
Firebase Firestore: consulta con OR lógico y paginación

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!

about 4 years ago · Juan Pablo Isaza
1 answers
Answer question

0

Necesito combinar estas consultas (obtener items , donde provider_id O company_id tiene 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 .

about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!