2014-11-08 96 views
2

查询从URL,例如解析:猫鼬动态查询

?year=2014&cat=sonny 

或者也可以

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

我能做

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

但是,如果有第二个例子吗?我怎样才能使它动态?

回答

3

您可以设置查询一个变量,并且添加多个条件:

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); 

对于动态,只是通过查询一个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); 
+0

如何执行或查询? :-) – m0z4rt 2016-08-03 04:17:08

+0

或在这里:http://stackoverflow.com/questions/15532238/how-to-execute-a-dynamic-number-of-criteria-in-mongoose-find – mimic 2016-11-01 18:03:03

3

建立在cdbajorin的答案 - 我怀疑许多编码人员正在尝试从表单中输入并从最终用户输入动态构建Mongoose过滤器。 (或者至少这是我的场景)。

如果“名”的HTML输入字段与您的猫鼬架构名称

<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);}); 
+0

我最近做了一个网站与类似的问题,这样做的伎俩。只需将查询存储在变量中并添加其他查询即可。工作得很好。 – ChrisRich 2015-12-13 05:04:55