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.
db.collection.find(query) --> Aquí este objeto de consulta cambiará según el parámetro de solicitud.
query = {}query = {location query}query = {datequery}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.
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.
Puede crear un objeto de consulta.
const query = {}; req.params.location && (query.location = req.params.location) req.params.date && (query.date = req.params.date)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:
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.