2013-08-06 73 views
2

我正在構建一個將問題消息存儲在數據庫中的流星應用程序。您可以要求提供郵件列表,但您也可以搜索郵件。有三個搜索字段:日期,患者ID和請求編號。可以搜索帶有一個或多個字段的消息。這些響應是所有完成字段相同的消息。因此,我建立了以下查詢:用流星和MongoDB查詢搜索命令

Template.list.problems = function() { 
var d = Session.get('search_on_date'); 
var p = Session.get('search_on_pid'); 
var r = Session.get('search_on_req'); 

var and_query = null; 

if (d!=null && p==null && r==null) and_query = {'Problem.DateTime': RegExp('^'+d)}; 
if (d==null && p!=null && r==null) and_query = {'Problem.PID':p}; 
if (d==null && p==null && r!=null) and_query = {'Problem.Request':r}; 
if (d!=null && p!=null && r!=null) and_query = {$and: [{'Problem.DateTime': RegExp('^'+d)}, {'Problem.PID':p}, {'Problem.Request':r}]}; 
if (d!=null && p!=null && r==null) and_query = {$and: [{'Problem.DateTime': RegExp('^'+d)}, {'Problem.PID':p}]}; 
if (d==null && p!=null && r!=null) and_query = {$and: [{'Problem.PID':p}, {'Problem.Request':r}]}; 
if (d!=null && p==null && r!=null) and_query = {$and: [{'Problem.DateTime': RegExp('^'+d)}, {'Problem.Request':r}]}; 

return problems.find(and_query); 
}; 

此解決方案有效,我對此非常滿意。但我的問題是:是否有更有效的方法來構建查詢?在這種情況下,我必須爲每個可能的已完成字段組合做一個if語句。因此只有三個領域是可能的,但是在很多領域我認爲必須有更好的解決方案。

所以我的問題:我怎麼能建立一個非常有效的方式與搜索查詢和條件,沒有太多的開銷?

謝謝。

回答

1

你可以做這樣的事情(僞代碼):

clauses = []; 

if (d!=null) clauses.push({'Problem.DateTime': RegExp('^'+d)}); 
if (p!=null) clauses.push({'Problem.PID':p}); 
if (r!=null) clauses.push({'Problem.Request':r}); 

if (clauses.length == 1) { 
    and_query = clauses[0]; 
} else { 
    and_query = {$and: clauses}; 
} 

return problems.find(and_query); 
0

對於你的約會,我想給他們一個圖形化的日期選擇器,並驗證輸入,然後做一個JavaScript Date對象的精確搜索,它會比使用正則表達式快很多。

至於代碼清理我個人做這樣的事情:

var $and = []; 
if(d) $and.push({'Problem.DateTime': new RegExp('^' + d)}); 
if(p) $and.push({'Problem.PID':p}); 
if(r) $and.push({'Problem.Request':r}); 

if($and.length > 0) { 
    if($and.length > 1) { 
     return problems.find({ $and: $and }); 
    } else { 
     return problems.find($and[0]); 
    } 
} 

我認識的編碼風格/可讀性它完全取決於炒作,這只是我怎麼會做它。

示例查詢日期:

var startDate = new Date(); // user supplied date 
var endDate = new Date(); // user supplied date again 
endDate.setDate(endDate.getDate() + 1); // add a day 
var query = { 
    'Problem.DateTime': { 
     $gte: startDate, 
     $lt: endDate 
    } 
}; 
+0

問題消息的日期是這樣的: 「04/05/2012 @ 09:53」。用戶可以在搜索表單中填寫的日期是例如'04/05/2012',沒有小時。這就是我使用正則表達式的原因。它是這樣的:'選擇*從問題whereDateTime如04/05/2012%'。我怎樣才能解決這個圖形日期選擇器? – Quantum

+0

我在我的回答中加了一個例子 – Dave

+0

好的,我明白了。感謝這個解決方案。我沒有想過這種查詢。 – Quantum