2013-08-06 2 views
2

Я создаю приложение метеоритов, которое хранит сообщения о проблемах в БД. Вы можете запросить список сообщений, но вы также можете искать сообщения. Существует три поля поиска: дата, идентификатор пациента и номер запроса. Можно искать сообщения с одним или несколькими полями. Ответ - это сообщения со всеми заполненными полями одинаковые. Поэтому я построил следующий запрос:Запрос команды поиска с метеором и 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

Для вашей даты, я дам им графический DatePicker и подтвердить ввод, а затем сделать точный поиск с объектов 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 ', без часа. Вот почему я использую Regex. Это что-то вроде: «Выберите * из проблем, где problem.DateTime, как 04/05/2012%». Как я могу решить это с помощью графического datepicker? – Quantum

+0

Я добавил пример на мой ответ – Dave

+0

ОК, я понимаю. Спасибо за это решение. Я не думал об этом вопросе. – Quantum

Смежные вопросы