tengo este esquema:
const SoundSchema = new Schema({ name: { type: String, required: true }, minFrec: { type: Number, required: true }, maxFrec:{ type: Number, required: true }, minInt:{ type: Number, required: true }, maxInt:{ type: Number, required: true }, category: { type: String, lowercase: true, required: true, enum: ["Hogar", "Naturaleza", "Conversación", "Ocio", "Lugares", "Ciudad"] } });Y estoy tratando de crear esta ruta para mostrar todos mis elementos que coinciden con una determinada categoría:
app.get("/sounds/:category", async (req, res) => { const sounds = await Sound.find({ category: 'Ocio' }).sort({ name: 'asc'}); res.render("sounds/category", { sounds }); });No funciona (devuelve una matriz vacía) pero funciona si filtro por algo sin "enumeración" (nombre, minInt, etc.).
He hecho otras rutas que funcionan, y puedo encontrar esos elementos en mongo (db.sounds.find({category: "Ocio"})) .
Su esquema define la category de campo en lowercase: true , lo que significa que la cadena se guardará en minúsculas ( docs )
Por lo tanto, debe usar minúsculas en su consulta para que coincida con el valor exacto.
const sounds = await Sound.find({ category: 'ocio' }).sort({ name: 'asc'});O algo más global:
const sounds = await Sound.find({ category: req.params.category.toLowerCase() }).sort({ name: 'asc'}); Incluso otra opción es usar $regex con la opción i gusta este ejemplo , pero es una opción mucho más costosa considerando que su esquema garantiza que el campo esté en minúsculas. Entonces, usar toLowerCase() es una mejor opción.