2014-11-08 149 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