【问题标题】:Mongoose complex queries with optional parameters?带有可选参数的猫鼬复杂查询?
【发布时间】:2017-12-31 15:03:32
【问题描述】:

我对 Mongo 和 mongoose 比较陌生,但遇到了一个问题。

我有一个相当复杂的查询(无论如何对我来说),这将允许用户搜索所有输入的术语。

所以如果查询是这样的:

var query = { '$and' : [
    { "foo1" : "bar1" },
    { '$and' : [ "foor2" : { $ne : null } }, { "foo2" : "bar2" } ] },
    { "foo3" : "bar3" }
]};

Doc.find(query);

但用户可以为参数输入任意数量的组合,即我可以搜索匹配 foo1 和 foo2 的所有项目,或者只搜索匹配 foo2 的所有项目,或者只搜索 foo3 等。

有没有办法告诉查询只查找不为空的参数,或者有没有办法以编程方式构建这样的搜索?我已经看到了其他选项,用于添加这样的参数,但它们似乎只添加在标准中

{ foo : 'bar' }

格式,并且由于某种原因,它们似乎总是被添加以查询它们是否满足 if 语句的条件。

谢谢。

【问题讨论】:

    标签: mongodb express mongoose mean-stack


    【解决方案1】:

    首先,您不需要$and 运算符来满足您的需求。逗号分隔是隐含的and

    您的示例查询应该是:

    var query = {
        "foo1": "bar1",
        //"foo2": { $ne: null}, is unnecessary as "foo2" is being searched for "bar2" already, so it won't be null
        "foo2": "bar2",
        "foo3": "bar3"
    };
    

    要动态构建此查询,您可以一一检查参数(例如req.body),然后使用括号表示法将它们添加到查询对象中:

    var query = {};
    
    if (req.body.foo1) {
        query["foo1"] = req.body.foo1
    }
    
    if (req.body.foo2) {
        query["foo2"] = req.body.foo2;
    }
    
    if (req.body.foo3) {
        query["foo3"] = req.body.foo3;
    }
    

    或者,您可以遍历参数并构建相同的查询对象如果您确定它们包含什么:

    var query = {};
    
    for(var key in req.body){ 
      query[key] = req.body[key];
    }
    

    【讨论】:

    • 非常感谢,我设法弄清楚如何做到这一点,但很高兴知道我找到了正确的解决方案。我想我做了一个看起来比它需要的更复杂的查询,这让我自己的生活变得更加艰难。菜鸟错误:)
    猜你喜欢
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 2015-05-19
    • 2021-04-02
    • 2018-08-09
    • 2017-11-29
    • 2014-10-05
    • 2021-07-15
    相关资源
    最近更新 更多