具有可选参数的Mongoose复杂查询?

时间:2017-07-25 15:21:34

标签: mongodb express mongoose mean-stack

我对Mongo& amp;猫鼬,我遇到了问题。

我有一个合理的(对我而言)复杂查询,允许用户搜索所有输入的术语。

所以如果查询是这样的话:

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

Doc.find(query);

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

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

{ foo : 'bar' }

格式,由于某种原因,他们似乎总是被添加到查询是否符合if语句的条件。

感谢。

1 个答案:

答案 0 :(得分: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];
}