猫鼬查找具有多个条件的记录并检查请求参数是否为空

mongoose finding records with multiple conditions and checking if the request parameter not empty

本文关键字:请求 检查 参数 是否 记录 查找 条件      更新时间:2023-09-26

我是这项技术的新手,使用Mongoose和MongoDB 3.3的Node和Express服务器。我有一个文档集合的以下模式:

exports.schemaLivre = new mongoose.Schema({
    Id : Number,
    Nom: { type: String, maxlength: 50 },
    Auteur: String,
    Description: String,
    Categorie: String,
}
exports.Livre = mongoose.model('Livre', schemas.schemaLivre);

我正在尝试运行一个有3个参数的web服务。

app.get('/Livres/search=:search&category:=category&auteur=:auteur', controller.RecupererLivresMultiple);

每个参数可以为空,对于每个参数我有不同的搜索逻辑(对于参数搜索,我将使用regex表达式同时检查"Nom"answers"Description"answers"Auteur"字段,对于类别和Auteur,提交的值必须等于字段的内容)。我将需要类似的东西,但我没有找到正确的查询。

exports.RecupererLivresMultiple = function (req, res) {
    var re = new RegExp(req.params.search, 'i');
    models.Livre.find($and: [ 
        { 
            $or: [
                { 'Auteur': req.params.auteur }, 
            ]
        },
        {
            $or: [ 
                { 'Category': req.params.Category }, 
            ]
        }
    ]).or([{'Nom': {$regex: re}}, {'Auteur': {$regex: re}},{'Description':{$regex: re}}]).exec(function (err, livres) {
        if (err) {
            return console.error(err);
        }
        res.json(livres);
    });
};

问题是如何检查从web服务发送的请求参数是空的,以及在搜索记录时如何在查询中禁用它。我的第二个问题是如何将这些搜索逻辑组合在一起?

我想你的查询的基本结构是:

{
    'Auteur': req.params.auteur,
    'Categorie': req.params.category,
    $or: [
        { 'Auteur': re}, 
        { 'Categorie': re}, 
        { 'Nom': re}, 
    ]
}
要使每个参数都是可选的,您可以这样做来构建查询:
// create empty query
var findJSON = {
};
// append criteria if parameters present
if (req.params.auteur){
    findJSON.Auter = req.params.auter
}
if (req.params.category){
    findJSON.Categorie = req.params.category
}
if (req.params.search){
    var re = new RegExp(req.params.search, 'i');
    findJSON.$or = [
        { 'Auteur': re}, 
        { 'Categorie': re}, 
        { 'Nom': re}, 
    ];
}
models.Livre.find(findJSON).exec(function (err, livres) {
    if (err) {
        return console.error(err);
    }
        res.json(livres);
});

因为每个参数都是可选的,所以应该处理没有提供参数的情况。你可以这样做:

if(req.params.auteur || req.params.category || req.params.search){
    models.Livre.find(findJSON).exec(function (err, livres) {
        if (err) {
            return console.error(err);
        }
        res.json(livres);
    });
} else {
    res.json([]);
}

您可能还想以不同的方式处理错误条件。正如您现在所拥有的,如果find()返回一个错误,您实际上并没有写入响应。