我对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 语句的条件。
谢谢。
首先,你不需要$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];
}