MongoDB: Buscar un valor en array simple sin complicarse (de más)

Muchos desarrolladores buscan un operador especial para encontrar un valor dentro de un array en MongoDB. La solución es más simple de lo que crees y yo mismo la aprendí tarde.

Tengo que confesarlo: al principio, cuando empecé con MongoDB, yo también le di mil vueltas a cómo buscar un valor específico dentro de un array. Mi cabeza iba directo a operadores tipo $contains o algo similar, porque claro, es lo que uno esperaría de forma intuitiva. Buscaba una forma compleja para algo que, en realidad, es bastante directo.

La pregunta típica que veo en foros y que me hicieron hace poco en un proyecto es: “Si tengo un esquema con un array de strings, como favouriteFoods: ["sushi", "pizza"], ¿cómo encuentro todos los documentos que tengan "sushi"?” La mayoría piensa que necesita un operador mágico para eso.

La solución simple y directa

Aquí es donde la sobreingeniería puede jugarte una mala pasada. La verdad es que, si tienes un array simple de strings (o números, o lo que sea), MongoDB es inteligente y puedes consultarlo directamente, como si fuera un campo normal.

Mira este ejemplo, que es lo que yo siempre recomiendo y lo que funciona:

PersonModel.find({ favouriteFoods: "sushi" });

¿Así de simple? Sí, así de simple. MongoDB entiende que si el campo favouriteFoods es un array, la condición "sushi" significa "encuentra documentos donde el array favouriteFoods contenga el valor 'sushi'". No hay que darle más vueltas. Esto me costó entenderlo, de hecho, me tomó un tiempo confiar en que no era un truco.

¿Y qué pasa con $in?

Algunos desarrolladores, queriendo ser más explícitos o pensando en una lógica de "contiene", recurren al operador $in. Lo he visto un montón de veces. Podrías escribir algo como esto:

PersonModel.find({ favouriteFoods: { "$in" : ["sushi"]} });

Esto funciona, sí. El resultado será el mismo. Pero en mi opinión, es innecesario. Estás usando un operador que está diseñado para buscar múltiples valores dentro de un campo (por ejemplo, favouriteFoods: { $in: ["sushi", "pizza"]}) cuando solo necesitas uno. Es como usar un martillo para clavar una chinche.

Mi punto es que complicarse con $in cuando solo buscas un valor es, muchas veces, sobreingeniería. Añade una capa de complejidad que no aporta nada y hace que el código sea un poco menos legible para quien no está familiarizado con esa particularidad.

Mi recomendación

Para buscar si un array simple de strings (o cualquier tipo) contiene un valor específico en MongoDB, usa la consulta directa. Es más limpia, más sencilla y MongoDB la optimiza perfectamente. Guarda el $in para cuando realmente necesites buscar si un campo tiene cualquiera de un listado de valores.

Y ojo, siempre es buena práctica definir explícitamente el tipo de tu array en el esquema de Mongoose, por ejemplo, favouriteFoods: [String]. Esto ayuda mucho a la validación y al entendimiento del modelo.

Jorge RequenaDeveloper full-stack · Chile