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

标签 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);

每个参数可以为空,对于每个参数我有不同的搜索逻辑(对于参数搜索,我将使用正则表达式同时检查“Nom”和“Description”和“Auteur”字段,对于category和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);
    });
};

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

最佳答案

我认为您想要的查询的基本结构是:

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

关于javascript - mongoose 查找多个条件的记录并检查请求参数是否不为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38876676/

相关文章:

javascript - Galleria - 隐藏缩略图轮播 div

node.js - CommonJS 是同步的,但如果调用异步函数会发生什么

MongoDB Kafka Connector 未使用 Mongo 文档 ID 生成消息 key

mongodb - 如何存储大量用户特定数据

javascript - 动态更新对象数组+ Mongoose 中的键

javascript - 重新排列行时参数列表后缺少 )

javascript - AngularJS:ngAnimate 在 IE10 上随机失败

javascript - 在有 Angular Material 底部工作表中使用选择下拉菜单

node.js - 如何在没有 webpack 的情况下离线使用 Vuetify?

Angular 产品构建期间 Javascript 内存不足