带有可选参数的猫鼬复杂查询?

Posted

技术标签:

【中文标题】带有可选参数的猫鼬复杂查询?【英文标题】: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 语句的条件。

谢谢。

【问题讨论】:

【参考方案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];

【讨论】:

非常感谢,我设法弄清楚如何做到这一点,但很高兴知道我找到了正确的解决方案。我想我做了一个看起来比它需要的更复杂的查询,这让我自己的生活变得更加艰难。菜鸟错误:)

以上是关于带有可选参数的猫鼬复杂查询?的主要内容,如果未能解决你的问题,请参考以下文章

具有多个和可选字段的猫鼬查找

带有嵌套可选对象的猫鼬模式

带有嵌套可选对象和必填字段的猫鼬模式

带有部分字符串的猫鼬文本搜索

无法查询嵌套的猫鼬数组?

UserModel 不可分配给 Document | 类型的参数nulll [带有 Typescript 的猫鼬]