从URL解析的查询,例如:
?year=2014&cat=sonny
或者它可以是
?year=2014&id=223&something=high&cat=sonny
我能做到
Model.find({year: 2014}).where('cat').equals('sonny')
但如果有第二个例子怎么办?我怎样才能让它变得动态?
答案 0 :(得分:4)
您可以将查询设置为变量并添加多个条件:
var query = Model.find();
query.where('year').equals('2014');
query.where('cat').equals('sonny');
query.where('id').equals('223');
query.where('something').equals('high');
query.exec(callback);
对于dynamic,只需将查询传递给for循环并遍历过滤器对象的数组:
var query = Model.find();
var filters = [
{fieldName: "year", value: "2014"},
{fieldName: "cat", value: "sonny"}
...
];
for (var i = 0; i < filters.length; i++) {
query.where(filters[i].fieldName).equals(filters[i].value)
}
query.exec(callback);
答案 1 :(得分:3)
基于cdbajorin的答案 - 我怀疑许多程序员正在尝试从表单中获取输入并从最终用户输入动态构建Mongoose过滤器。 (或者至少那是我的情景)。
如果你'命名'html输入字段与你的Mongoose Schema名称相同
<input type='text' name='person.address'>
然后在您的代码中,您可以使用req.body对象
var query = Model.find();
for (var fieldName in req.body)
{
if(req.body.hasOwnProperty(fieldName)) //no inherited properties
{
if(req.body[fieldName]) //get rid of empty fields
{
query.where(fieldName).equals(req.body[fieldName]);
}
}
}
query.exec(function(err,data){console.log('QUERY EXECUTE : ' + err, data, data.length);});