【问题标题】:A find() statement with possible null parameters带有可能为空参数的 find() 语句
【发布时间】:2017-06-14 05:47:45
【问题描述】:

我正在尝试弄清楚 Mongoose 和 MongoDB 是如何工作的……我对它们真的很陌生,我似乎无法弄清楚如何根据 find 语句返回值,其中一些给定的参数在查询中可能为 null - 我可以为此设置一个属性吗?

为了进一步解释,我有一个网页,其中包含用于搜索公司的不同输入字段,但它们并非都是强制性的。

var Company = mongoose.model('Company');
    Company.find({companyName: req.query.companyName, position: req.query.position,
                  areaOfExpertise: req.query.areaOfExpertise, zip: req.query.zip,
                  country: req.query.country}, function(err, docs) {
                    res.json(docs);
                  });

通过填写网页上的所有输入字段,我会得到一个结果,但只有一个匹配的特定字段。假设我只填写country,它什么都不返回,因为其余的都是空的,但我希望返回所有行,例如在德国。我希望我表达得足够清楚。

【问题讨论】:

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


    【解决方案1】:

    您需要使用 $or 逻辑运算符包装查询,例如

    var Company = mongoose.model('Company');
    Company.find(
        {
            "$or": [
                { "companyName": req.query.companyName }, 
                { "position": req.query.position }, 
                { "areaOfExpertise": req.query.areaOfExpertise },  
                { "zip": req.query.zip }, 
                { "country": req.query.country }
            ]
        }, function(err, docs) {
            res.json(docs);
        }
    );
    

    另一种方法是构造一个检查空参数的查询,如果它们不为空,则将其作为查询的一部分包含在内。例如,您可以只使用 req.query 对象作为查询,假设键与文档的字段相同,如下所示:

    /* 
    
    the req.query object will only have two parameters/keys e.g.
    req.query = { 
        position: "Developer", 
        country: "France" 
    }
    */
    var Company = mongoose.model('Company');
    Company.find(req.query, function(err, docs) {
        if (err) throw err;
        res.json(docs);
    });
    

    在上面,req.query 对象充当查询并具有隐式逻辑 AND 操作,因为 MongoDB 在指定逗号分隔的表达式列表时提供了隐式 AND 操作。当必须在多个表达式中指定相同的字段或运算符时,必须使用带有 $and 运算符的显式 AND。


    如果您正在查询同时满足逻辑 ANDOR 的查询,即返回与这两个子句的条件匹配的所有文档,例如给定对 position AND country 或任何其他字段的查询,那么您可以将查询调整为:

    var Company = mongoose.model('Company');
    Company.find(
        {
            "$or": [
                { "companyName": req.query.companyName }, 
                { 
                    "position": req.query.position,
                    "country": req.query.country 
                }, 
                { "areaOfExpertise": req.query.areaOfExpertise },  
                { "zip": req.query.zip }
    
            ]
        }, function(err, docs) {
            res.json(docs);
        }
    );
    

    但话又说回来,这可能取决于需要加入哪些查询参数作为强制性等。

    【讨论】:

    • 我会试试的。非常感谢。
    • 让我更接近谢谢,但我必须找到不同的解决方案,因为如果我搜索“UI Developer”和“France”,它会返回所有国家和法国所有职位的所有 UI 开发人员。
    • 您可能需要调整上述查询,以使某些查询子句满足逻辑 AND 即返回与两个子句的条件匹配的所有文档。
    【解决方案2】:

    我最终只是删除了查询中的参数,以防它们为空。似乎提交中的所有文本字段都提交为“”(空)。由于数据库中没有这样的值,它不会返回任何内容。如此简单,我从未想过...

    例子:

    if (req.query.companyName == "") {
            delete req.query.companyName;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多