Necesito ayuda para ajustar el código para esto:
const posts = await PostMessage.find({ $or: [ { title }, { tags: { $in: tags.split(',') } } ]}); Por el momento, puede filtrar las publicaciones utilizando un formulario de búsqueda que tiene título y publicaciones. Puede dejar uno vacío cuando busque. Funciona bien excepto cuando usas ambos. Por ejemplo, buscar "senderismo" y etiquetar "Europa" mostraría publicaciones tanto para títulos de senderismo como para etiquetas de Europa (cuando quisiera que la búsqueda se redujera para mostrar solo publicaciones con el título senderismo y etiquetadas como Europa). Sé que puedo usar $and en lugar de $or pero eso solo devuelve las publicaciones si el usuario ingresa tanto el título como las etiquetas cuando quiero darle al usuario la opción de dejar uno en blanco. ¿Puede alguien ayudarme a escribir el código para eso?
Por lo que he visto, me preguntaba si podría hacer algo como esto:
O: { (Y: título no nulo, etiquetas no nulas) (O título nulo, etiquetas no nulas) (O título no nulo, etiquetas nulas))
¿Es posible hacer esto? No puedo encontrar un ejemplo similar. ¡Gracias por la ayuda!
Suponiendo que ninguno de los parámetros ( title , tags ) no estará definido, puede diseñar la consulta antes de ejecutarla
const query = { title: title, tags: { $in: tags.split(",") }, }; const params = { title, tags }; Object.keys(params).forEach((param) => { if (!params[param]) { delete query[param] // delete from query if value is not present } }); const posts = await PostMessage.find(query);De esta manera usará solo los parámetros que tienen valores.