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

226
Vistas
¿El método de búsqueda de Mongodb puede tomar consultas dinámicas?

Soy un principiante en mongodb, por lo que sería genial si alguien me aconsejara cómo escribir la consulta a continuación de manera eficiente.

Tengo una colección que tiene ubicación y fecha como campos.

Hay 4 condiciones para la búsqueda.

  • El usuario puede buscar sin ningún parámetro
  • El usuario puede buscar solo con la fecha
  • El usuario puede buscar solo con la ubicación
  • el usuario puede buscar con fecha y ubicación

db.collection.find(query) --> Aquí este objeto de consulta cambiará según el parámetro de solicitud.

  • Si no requiere parámetro, query = {}
  • Si la ubicación está presente, query = {location query}
  • Si la fecha está presente, query = {datequery}
  • Si tanto la consulta de fecha como la de ubicación query = {location query , datequery}

¿Cómo puedo hacerlo simple con los comandos mongodb? Sé cómo hacerlo en SQL agregando la cláusula where en función de los parámetros no nulos en la solicitud, pero me confundo con la sintaxis de nosql.

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

Lo construirías así:

 const query = {}; if (req.params.location) { query.location = req.params.location } if (req.params.date) { query.date = new Date(req.params.date); } const results = await db.collection.find(query);

Donde req.params es un objeto con ubicación y fecha como campos opcionales.

over 4 years ago · Santiago Trujillo Denunciar

0

Puede crear un objeto de consulta.

 const query = {}; req.params.location && (query.location = req.params.location) req.params.date && (query.date = req.params.date)
over 4 years ago · Santiago Trujillo Denunciar

0

El problema general al que se enfrenta aquí es el problema de construir objetos complejos basados en algunos parámetros/entradas, que se pueden resolver a través de un patrón de diseño conocido como patrón de construcción.

Aunque implementar tales patrones puede hacer que su código parezca un poco complejo (tome esto como ejemplo), aquí está mi implementación muy simple:

 "use strict"; const queryBuilder = () => { const query = {}; return { addLocation: function(location){ if(typeof location === "string" && location.length>0){ query.location = location.trim(); } return this; }, addDate: function(date){ const dateObj = date ? new Date(date) : null; if(dateObj && !isNaN(dateObj.valueOf())){ query.date = dateObj; } return this; }, build: function(){ Object.freeze(query); return query; } } } app.get('/:location/:date',async(req,res,next) => { //however you're connecting to the db, you'll need a connected instance const db = getDbSomehow(); const myQuery = queryBuilder() .addLocation(req.params.location) .addDate(req.params.date) .build(); const results = await db.collection.find(myQuery).toArray(); //do whatever you need here })

Esto parece mucho más escribir que algunas de las otras respuestas que ha visto que deben estar funcionando, pero aquí hay algunas ventajas:

  1. Código más limpio en su controlador de solicitudes.
  2. Puede cambiar todas las validaciones, etc. en los métodos del constructor.
  3. ¿Necesita agregar otra propiedad en la consulta? Implemente el método en el constructor, llámelo y listo.
  4. ¿Necesita cambiar el orden de las claves en su objeto de consulta? Cambie el orden en que se llaman los métodos del constructor.
  5. Inmutabilidad: puede usar Object.freeze() o una biblioteca como deep-freeze en su método de build para hacer que el objeto sea inmutable para que nada pueda cambiarlo una vez que esté hecho.
over 4 years ago · Santiago Trujillo 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