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

时间:2016-08-10 14:45:42

标签: javascript node.js mongodb mongoose mongodb-query

我是这项技术的新手,并使用使用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);

每个参数都可以为空且foreach参数我有不同类型的搜索逻辑(对于参数搜索,我将使用正则表达式来同时检查“Nom”和“Description”和“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服务发送的请求参数是否为空以及如何在搜索记录时在查询中禁用它。 我的第二个问题是如何将这些搜索逻辑结合在一起?

1 个答案:

答案 0 :(得分:2)

我认为您的查询所需的基本结构是:

{
    '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()返回错误,你实际上并没有写入响应。