Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

133
Vistas
Agregar propiedades dinámicamente a la consulta de la base de datos en JavaScript

Estoy escribiendo una función para consultar una colección de base de datos de Firestore para documentos que solo tienen ciertas propiedades. Los filtros se definen como una matriz de pares "clave, valor". p.ej:

 [ ["Colour", "green"], ["Colour", "blue"], ["Greeting", "hello"] ]

Esta matriz puede tener cualquier longitud y estoy tratando de obtener todos los documentos de la base de datos que no tienen valores enumerados en la matriz de filtros.

Puedo hacer esto usando:

 await db.collection("database") .where("Colour", "!=", "blue") .where("Colour", "!=", "green") .where("Greeting", "!=", "hello") .get()

Mi problema es que el filtro puede tener cualquier longitud, por lo que no puedo escribir la consulta para tener un número determinado de métodos .where() . ¿Hay alguna forma en JavaScript de que pueda agregar dinámicamente métodos a una consulta como se muestra arriba (sin saber cuántos métodos necesito agregar)?

Mi solución en este momento es solo consultar la base de datos completa, luego ordenarla usando las funciones de filtro de Javascript, pero me gustaría solo tener que consultar la base de datos para obtener los valores necesarios.

Alternativamente, ¿hay alguna otra consulta de Firestore que pueda completar este filtro? Estaba mirando los documentos , pero la forma en que mi filtro está configurado con pares clave/valor que podrían repetirse o no estar definidos, no parecía que ninguno de los métodos de consulta complejos funcionara.

about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

Suponiendo que está creando una matriz llena de pares clave-valor excluidos y que los valores que está excluyendo están indexados correctamente, podemos comenzar definiendo algunas constantes:

 const collectionRef = db.collection("database"); const excludedKeyValuePairs = [ ["Colour", "green"], ["Colour", "blue"], ["Greeting", "hello"], ]

Ahora que los tenemos, podemos construir la consulta usando Array#reduce .

 const query = excludedKeyValuePairs .reduce( (query, [key, value]) => query.where(key, "!=", value), // appends the new constraint, returning the new query object collectionRef ); const querySnapshot = await query.get();

Sin embargo, si puede usar el Firestore SDK modular más nuevo, también puede lograr el mismo resultado usando:

 import { getFirestore, getDocs, collection, query, where } from "firebase/firestore"; const db = getFirestore(); const collectionRef = collection(db, "database"); const constraints = [ where("Colour", "!=", "green"), where("Colour", "!=", "blue"), where("Greeting", "!=", "Hello") // elements can also be added or removed using standard array methods as needed. ] // OR const constraints = excludedKeyValuePairs.map(([key, value]) => where(key, "!=", value)) const querySnapshot = await getDocs(query(collectionRef, ...constraints));
about 4 years ago · Juan Pablo Isaza Denunciar

0

Puede mapear desde su conjunto de condiciones a las cláusulas where con:

 const exclusions = [ ["Colour", "green"], ["Colour", "blue"], ["Greeting", "hello"], ] let collectionRef = db.collection("database"); const conditions = exclusions.map((e) => where(e[0], "!=", e[1])); let query = query(collectRef, conditions); const querySnapshot = await getDocs(query);
about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda