2015-06-29 85 views
0

我有了城市的列表,狀態和郵政編碼MongoDB數據庫。我希望能夠運行一個查詢,根據用戶輸入檢查這些字段中的每一個,並且無法確定如何執行此操作。以下是文件中的DB的例子:的NodeJS,貓鼬 - 查詢城市,州或郵編

{"_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); 
     }); 
    }); 

的問題是,如果我的一些疑問加利福尼亞州聖地亞哥的查詢將失敗,因爲它只搜索城市。如何查詢城市,州和郵政編碼(_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在他的評論幫助。