Mongoose .find() 通过枚举字段搜索时返回一个空数组

Posted

技术标签:

【中文标题】Mongoose .find() 通过枚举字段搜索时返回一个空数组【英文标题】:Mongoose .find() returns an empty array when searching by enum field 【发布时间】:2022-01-21 04:49:22 【问题描述】:

我有这个架构:

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"]
    
);

我正在尝试创建这条路线来显示我所有与某个类别匹配的项目:

app.get("/sounds/:category", async (req, res) => 
const sounds = await Sound.find( category: 'Ocio' ).sort( name: 'asc');
res.render("sounds/category",  sounds );
);

它不起作用(返回一个空数组),但如果我用没有“枚举”的东西(名称、minInt 等)进行过滤,它就会起作用。

我已经完成了其他可行的路线,我可以在 mongo (db.sounds.find(category: "Ocio")) 中找到这些项目。

【问题讨论】:

【参考方案1】:

您的架构将字段 category 定义为 lowercase: true,这意味着字符串将以小写形式保存 (docs)

因此,您必须在查询中使用小写字母来匹配确切的值。

const sounds = await Sound.find( category: 'ocio' ).sort( name: 'asc');

或者更全球化的东西:

const sounds = await Sound.find( category: req.params.category.toLowerCase() ).sort( name: 'asc');

甚至另一个选项是使用$regex 和选项i 就像this example 但考虑到您的架构确保该字段是小写的,这是一个更昂贵的选项。所以使用toLowerCase() 是更好的选择。

【讨论】:

以上是关于Mongoose .find() 通过枚举字段搜索时返回一个空数组的主要内容,如果未能解决你的问题,请参考以下文章

使用 Mongoose 搜索用户

Mongoose如何过滤填充字段

Mongoose 没有使用简单的 find() 返回文档中的所有字段

find(...).populate 不是 mongoose 中的函数

带有全文搜索和项目的 Mongoose 子字段聚合

Mongoose 校验参数