Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

276
Visualizações
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 Respostas
Responde à pergunta

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda