2015-04-06 34 views
9

我試圖從輸入接收從窗體生成搜索。以編程方式構建動態查詢與貓鼬

router.get('/data', function(req, res) { 
    var firstName=req.body.firstName, 
    lastName=req.body.lastName, 
    companyName=req.body.companyName, 
    email=req.body.email; 
}); 

我想從這些數值構建查詢,但如果字段沒有價值,我顯然不希望把它列入搜索(搜索「」會改變結果)

我已經嘗試了幾個不同的東西,比如建立一個字符串的地方:

mongoose.model('customers').find({QUERY STRING WOULD GO HERE} ,function(err, data) { 
    if (err) return console.error(err); 
    console.log(data); 
}); 

但是,這似乎並沒有正常工作。我也試過這樣的「疊加」的搜索查詢:

if(firstName !="") { 
    mongoose.model('customers').find({firstName: firstName}) 
} 

,然後執行這樣的搜索:

mongoose.model('customers').exec(function(err, customer){ 
    console.log(customer); 
}); 

但是,這會導致500錯誤(我不知道是否有任何更多的信息我可以從他們那裏得到)。

請幫助新手動態地構建一個貓鼬的搜索查詢:(

+0

取而代之的是查詢字符串的,你嘗試構造查詢對象? (如果你是JavaScript新手,其他語言稱之爲「哈希」或「映射」或「數組」) – slebetman 2015-04-06 06:27:40

+0

@slebetman你是完全正確的。我查找了如何創建一個對象,但只是沒有做好它:( – 2015-04-06 20:27:48

回答

16

嘗試創建query對象,如:

//generate query object based on availability of value 
var query = {}; 
if(your_variable !== "") { 
    query["some_key"] = your_variable; 
} 
if(your_second_variable !== "") { 
    query["some_other_key"] = your_second_variable; 
} 
mongoose.model('customers').find(query, function(err, c) { 
    //do something 
}); 
+0

我做到了這一點,它的工作!我試圖讓一個對象錯了整個時間!謝謝你幫助我! – 2015-04-06 20:32:30

+0

完美的作品! – user3344977 2016-07-18 02:22:28

+0

嗨DemoUser, 如果我想把'在'檢查如何使用上面的一個,意味着我想檢查這個{用戶名:{$ in:['x','y','z']}}。在這種情況下,第一個變量和第二個變量是什麼。 – RamBen 2016-09-21 05:44:33

2

爲了避免獨立檢查每個參數可以循環通過他們

var query = {}; 
for(var key in req.body){ //could also be req.query and req.params 
    req.body[key] !== "" ? query[key] = req.body[key] : null; 
} 

mongoose.model('customers').find(query, function(err, customers){ 

}) 
+0

這非常有幫助,謝謝!我已經在我的應用程序的其他地方完成了這個任務,並且它非常有幫助! – 2017-03-28 16:46:50

2

對於使用較新JavaScript的人(特別是在Node.js 7.6.0+或Babel上)

我發現以編程方式構建查詢(基於if子句等)的最佳方式是使用查詢和替代語法。

let query = PersonModel().find(); 

if (isMale) { 
    query.where('sex', 'male'); 
} else { 
    query.where('sex', 'female'); 
} 

query.where('alive', true); 

// and then to run the query 
const result = await query.exec(); 

請注意async/await這裏的用法。它在Node.js 7.6.0+上完美運行。如果你不希望使用async/await你可以使用承諾,像這樣:

query.exec().then(result => { 
    // result has your... results 
}); 
+0

感謝您的輸入!我的用例簡單得多不過,我非常感謝它!我確信有人會很好地使用它! – 2017-03-28 16:46:16