带有可选参数的猫鼬复杂查询?
Mongoose complex queries with optional parameters?
我对 Mongo 和 mongoose 比较陌生,遇到了一个问题。
我有一个相当(无论如何对我来说)复杂的查询,它将允许用户搜索所有输入的术语。
所以如果查询是这样的:
var query = { '$and' : [
{ "foo1" : "bar1" },
{ '$and' : [ "foor2" : { $ne : null } }, { "foo2" : "bar2" } ] },
{ "foo3" : "bar3" }
]};
Doc.find(query);
但用户可以输入任意数量的参数组合,即我可以搜索匹配 foo1 和 foo2 的所有项目,或者只搜索匹配 foo2 的所有项目,或者只搜索 foo3 等。
有没有办法告诉查询只查找不为空的参数,或者有没有办法以编程方式构建这样的搜索?我见过其他选项,用于添加这样的参数,但它们似乎只添加到标准
{ foo : 'bar' }
format,而且由于某些原因,它们似乎总是被添加以查询它们是否满足 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];
}
我对 Mongo 和 mongoose 比较陌生,遇到了一个问题。
我有一个相当(无论如何对我来说)复杂的查询,它将允许用户搜索所有输入的术语。
所以如果查询是这样的:
var query = { '$and' : [
{ "foo1" : "bar1" },
{ '$and' : [ "foor2" : { $ne : null } }, { "foo2" : "bar2" } ] },
{ "foo3" : "bar3" }
]};
Doc.find(query);
但用户可以输入任意数量的参数组合,即我可以搜索匹配 foo1 和 foo2 的所有项目,或者只搜索匹配 foo2 的所有项目,或者只搜索 foo3 等。
有没有办法告诉查询只查找不为空的参数,或者有没有办法以编程方式构建这样的搜索?我见过其他选项,用于添加这样的参数,但它们似乎只添加到标准
{ foo : 'bar' }
format,而且由于某些原因,它们似乎总是被添加以查询它们是否满足 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];
}