2013-08-06 91 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