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

229
Views
¿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 answers
Answer question

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 Report

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 Report

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 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!