具有多个和可选字段的猫鼬查找

Posted

技术标签:

【中文标题】具有多个和可选字段的猫鼬查找【英文标题】:Mongoose find with multiple and optional fields 【发布时间】:2020-08-10 03:22:31 【问题描述】:

我是猫鼬的新手,目前我正在编写一个应用程序来学习它。我有一个艺术家模式和一个使用多个可选字段进行搜索的表单。例如,用户可以输入姓名、最小年龄并在模型中进行搜索,而无需填写其他表单字段。

在控制器上,我通过 req.body 对象从表单中获取所有字段,并且我有一个查询对象,它带有多个 if 语句,我检查属性是否未定义,如果不是,我将其放入对象作为属性,并将对象传递给 find 方法。

问题是当我填写最小年龄并将此属性query.min_age = $gte: min_age 放入查询对象时,$gte 会转换为字符串,因此无法正确运行 find 方法。

猫鼬模型

const mongoose = require("mongoose");
const AlbumSchema = require("./album")
const CompanySchema = require("./company")

const Schema = mongoose.Schema;

const ArtistSchema = new Schema(
    name: String,
    age: Number,
    yearsActive: Number,
    albums: [AlbumSchema],
    company:[type: Schema.Types.ObjectId, ref: "Company"]
);

const Artist = mongoose.model("artist", ArtistSchema);

module.exports = Artist;

控制器

app.post("/", (req, res, next) => 
    const name = req.body.name;
    const min_age = req.body.min_age;
    const min_active = req.body.min_active;
    const sort = req.body.sort;
    const query = ;

    if(name) 
        query.name = name;
    

    if(min_age) 
        query.min_age =  $gte: min_age;
    

    if(min_active) 
        qyery.min_active = gte: min_active;
    

    Artist.find(query).
    sort(sort)
    .then( artists => 
         res.render("index", 
             artists: artists
        )
    );
);

下图描绘的是我控制台时的字符串 $gte:

【问题讨论】:

【参考方案1】:

JS 对象中的键总是转换为字符串,因此$gte 在您发布的屏幕截图中是字符串并没有错。

至于min_age 值,在您的代码中,我看不到任何可以将其转换为字符串的内容,而猫鼬本身也没有这样做。

看起来问题出在测试请求中。请检查您是在 POST 请求中以数字形式还是以字符串形式发送 min_age。它应该是一个数字,否则您需要将其转换为控制器中的数字(例如 parseInt()

【讨论】:

以上是关于具有多个和可选字段的猫鼬查找的主要内容,如果未能解决你的问题,请参考以下文章

带有嵌套可选对象和必填字段的猫鼬模式

用于查找唯一文档的猫鼬查询

猫鼬用一个搜索参数查找具有组合字段的文档

在猫鼬中按索引查找一个

猫鼬在查找中排除时返回默认值

具有多个子路径的猫鼬填充路径