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

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

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 Relatório

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 Relatório

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