Actualmente estoy intentando implementar un filtro de campos múltiples en una base de datos MongoDB que consta de problemas con múltiples campos. Estoy aprendiendo del libro "Pro MERN Stack" de Vasan Subramanian, pero su filtro multicampo no incluye el filtrado por un valor de cadena. Me gustaría que mi filtro String filtre las coincidencias parciales, no solo las coincidencias exactas. Por ejemplo, si un título es "Hola mundo", me gustaría que la consulta "Hola" coincida con este título. Incluí mi código JS funcional que actualmente solo funciona si la entrada del título coincide exactamente con el campo de título de un problema en el backend.
Intenté anteponer el título con un '/' y agregarlo con un '/i', y cuando imprimo el filtro usando console.log genera { title: '/Hello/i' } . Sin embargo, si solo codifico la línea y elimino las comillas simples alrededor del argumento para .find() escribiendo la línea como const issues = await db.collection('issues').find({title: /Hello/i }).toArray(); funciona en coincidencias parciales. ¿Hay alguna manera fácil de resolver este problema?
async function list(_, { status, effortMin, effortMax, title, }) { const db = getDb(); const filter = {}; if (status) filter.status = status; if (title) filter.title = title; if (effortMin !== undefined || effortMax !== undefined) { filter.effort = {}; if (effortMin !== undefined) filter.effort.$gte = effortMin; if (effortMax !== undefined) filter.effort.$lte = effortMax; } const issues = await db.collection('issues').find(filter).toArray(); return issues; }MongoDB ya proporciona una solución que permite la funcionalidad de búsqueda avanzada Atlas Search
El proceso requiere que cree un índice para sus consultas de búsqueda, de modo que las consultas que requieran la funcionalidad de búsqueda avanzada tendrán que hacer referencia a ellas.
Creación de índices de búsqueda de Atlas
Dado que está interesado en hacer coincidir parcialmente los campos con su documento, el campo de autocompletar es lo que desea definir al crear su índice
{ $search: { "index": "<index name>", // optional, defaults to "default" "autocomplete": { "query": "<search-string>", "path": "<field-to-search>", "tokenOrder": "any|sequential", "fuzzy": <options> } } } Preste atención al objeto fuzzy , ya que permite un control preciso sobre cómo se empareja la búsqueda.
fuzzy.maxEdits Número máximo de ediciones de un solo carácter necesarias para que coincida con el término de búsqueda especificado. El valor puede ser 1 o 2.
fuzzy.prefixLength Número de caracteres al comienzo de cada término en el resultado que debe coincidir exactamente.
Documentación de Autocompletar
Una vez completada la creación del índice, deberá realizar consultas utilizando la etapa de canalización de agregación $search de la siguiente manera
{ $search: { "index": "<index-name>", "autocomplete": { "query": "<search-string>", "path": "<field-to-search>" } } }Documentación de etapa de canalización de agregación de $búsqueda