mongodb 使用多个可选字段进行Mongoose查找

htzpubme  于 2022-11-03  发布在  Go
关注(0)|答案(2)|浏览(240)

我是mongoose的新手,目前我正在编写一个应用程序来学习它。我有一个艺术家模式和一个搜索多个可选字段的表单。例如,用户可以输入姓名、最低年龄,然后在模型中搜索,而无需填写其他表单字段。
在控制器上,我通过req.body对象从表单中获取所有字段,我有一个查询对象,它使用多个if语句检查属性是否未定义,如果没有,我将其作为属性放在对象中,然后将该对象传递给find方法。
问题是,当我填充min age并将此属性query.min_age = { $gte: min_age}放入查询对象时,$gte会将其转换为字符串,因此无法正确运行find方法。
Mongoose 模型

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:

i7uq4tfw

i7uq4tfw1#

JS对象中的键总是被转换为字符串,所以在您发布的屏幕截图中,$gte是字符串并没有什么错。
至于min_age值,在您的代码中,我看不到任何将其转换为字符串的内容,mongoose本身也没有这样做。
问题似乎出在测试请求中。请检查您是在POST请求中以数字形式发送min_age,还是以字符串形式发送。它应该是数字,否则您需要在控制器中将其转换为数字(例如parseInt()

qij5mzcb

qij5mzcb2#

const name = new RegExp(req.body.name, 'i');
const min_age = req.body.min_age;
const min_active = req.body.min_active;
const sort = req.body.sort;
const query = {};

if(req.body.name!=undefined && req.body.name!=''){
   query["$and"]=[{name :re}]
}
if(min_age){
   query["$and"].push({min_age:{ $gte: parseInt(min_age)}})
}
if(min_active ){
   query["$and"].push({min_active:{ $gte: parseInt(min_active)}})
}
let artists=await Artist.find(query).sort(sort)

res.render("index", {
  artists: artists
})

相关问题