Mongoose动态查询

时间:2014-11-08 18:51:59

标签: node.js mongodb mongoose

从URL解析的查询,例如:

?year=2014&cat=sonny

或者它可以是

?year=2014&id=223&something=high&cat=sonny

我能做到

Model.find({year: 2014}).where('cat').equals('sonny')

但如果有第二个例子怎么办?我怎样才能让它变得动态?

2 个答案:

答案 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);});