2015-06-29 1 views
0

У меня есть база данных MongoDB, в которой есть список городов, штатов и почтовых индексов. Я хотел бы иметь возможность запускать запрос, который будет проверять каждое из этих полей в зависимости от ввода пользователя, и мне трудно понять, как это сделать. Вот пример документа в БД:NodeJS, Mongoose - Query city, state или zip

{"_id":"92199","city":"San Diego","state":"CA"} 

Вот мой маршрут, я использую, чтобы вернуть этот документ:

app.get('/city/:city', function(req, res){ 
     var query = City.aggregate([ 
      { $group: { _id: "$zip", city: {"$first" : "$city"}, state: {"$first" : "$state"} } }, 
      { $match: {"city": new RegExp(req.params.city, "i")} } 
     ]); 
     query.exec(function(err, city){ 
      if(err){ 
       console.log(err); 
       return res.send(err); 
      } 
      console.log(city); 
      res.json(city); 
     }); 
    }); 

Проблема заключается в том, что если я несколько запросов в Сан-Диего, штат Калифорния в запрос будет терпеть неудачу, потому что он ищет только город. Как запросить город, состояние и zip (_id), чтобы значение все равно возвращалось?

+0

не следует выполнять агрегацию один раз, а не за запрос –

+0

Я просто использовал агрегацию, потому что все мои поисковые запросы, казалось, указывали на нее как способ запроса нескольких полей. – yhussain

+1

Это звучит как обычный запрос (а не что-то, что требует агрегации) - что вы имеете в виду, «запрос провалится, потому что он только ищет город»? – Semicolon

ответ

0

Это закончило работу для меня на тот случай, если кто-то заинтересован. Вероятно, будет реорганизовывать, но это работает:

app.get('/city/:city', function(req, res){ 

     var location = req.params.city.replace(",", ""); 
     location = toTitleCase(location); 
     location = location.split(" "); 

     for (var i = 0; i < location.length; i++) { 
      if(location[i].length == 2){ 
       var state = location[i].toUpperCase(); 
       var stateIndex = i; 
      } 
      if(!isNaN(parseFloat(location[i])) && isFinite(location[i])){ 
       var zip = location[i]; 
       var zipIndex = i; 
      }    
     } 

     if(zipIndex){ 
      location.splice(zipIndex, 1); 
     } 
     if(stateIndex){ 
      location.splice(stateIndex, 1); 
     } 

     location = location.join(" "); 

     if(state && zip){ 
      var query = City.find({ 
      $and: [ 
       { $and: [{"state": state}, {"city": new RegExp(location, "i")}] }, 
       { "zip" : zip } 
      ] 
     }); 
     }else if(zip){ 
      var query = City.find({ 
       $or : [{"city": new RegExp(location, "i")}, {"zip" : zip}] 
      }); 
     }else if(state){ 
      var query = City.find({ 
       $and: [{"state": state}, {"city": new RegExp(location, "i")}] 
      }); 
     } 
     else{ 
      var query = City.find({ 
       "city": new RegExp(location, "i") 
      }); 
     } 
     query.exec(function(err, city){ 
      if(err){ 
       console.log(err); 
       return res.send(err); 
      } 
      res.json(city); 
     }); 
    }); 

Заслуга @Semicolon за его помощь в комментариях.