【问题标题】:Search by city, address, state, mls number按城市、地址、州、mls 号搜索
【发布时间】:2014-09-22 18:23:54
【问题描述】:

`我在mongodb中有一个listing列表,所以每个listing都包含以下字段:

{
  "city" : "Yucca Valley",
  "county" : "San Bernardino",
  "fullStreetAddress" : "7496 CHULA VISTA Avenue",
  "state" : "CA",
  "zipCode" : "92284",
  "streetName" : "7496",
  "streetNumber" : "CHULA VISTA",
  "mls" : "41462506"
}

我有一个搜索输入,我正在尝试编写一个按此列搜索并返回结果的语句。查询按空格拆分 searchQuery 并按每个单词搜索。 对于Yucca,它返回正确的结果,但对于Yucca ValleyYucca Valley CA 则不正确。

这是我的搜索查询:

 var searchQuery = req.param('q') ? req.param('q').trim() : null;
      if (searchQuery) {

          var searchQueryArray = searchQuery.split(" ");
          var page = req.param('page') ? req.param('page') : 1;
          var pageData = {};

          var query =  Property.find()

          searchQueryArray.forEach(
              function (queryItem){
                  var orNumeric = [];
                  var orStrings = [];

                  console.log(queryItem);

                  // check, if word contains only numbers, compare it to numeric fields
                  if(/^\d+$/.test(queryItem)){
                      orNumeric.push({streetNumber: {like: "%" + queryItem + "%"}});
                      orNumeric.push({zipCode: {like: "%" + queryItem + "%"}});
                      orNumeric.push({mls: {like: "%" + queryItem + "%"}});
                      query.where({or: orNumeric});
                  } else {
                      orStrings.push({streetName: {like: "%" + queryItem + "%"}});
                      orStrings.push({city: {like: "%" + queryItem + "%"}});
                      orStrings.push({state: {like: "%" + queryItem + "%"}});
                      query.where({or: orStrings})
                  }
              }
          );

          query.where({or: [
              {"fullStreetAddress": {like: "%" + searchQuery + "%"}}
          ]});

我猜,这是因为最后一个 where 覆盖了之前的。谁能建议如何修改此查询以使其返回正确的结果。

【问题讨论】:

    标签: jquery node.js mongodb search sails.js


    【解决方案1】:

    我通过使用.native() 而不是.query() 解决了这个问题。

     var searchQueryArray = searchQuery.split(" ");
     var andQuery = [];
    
     searchQueryArray.forEach(
        function (queryItem) {
           var orNumeric = [];
           var orStrings = [];
    
    
                    // check, if word contains only numbers, compare it to numeric fields
            if (/^\d+$/.test(queryItem)) {
                 orNumeric.push({"streetNumber": {'$regex': ".*" + queryItem + ".*"}});
                 orNumeric.push({"zipCode": {'$regex': ".*" + queryItem + ".*"}});
                 orNumeric.push({"mls": {'$regex': ".*" + queryItem + ".*"}});
                 andQuery.push({"$or": orNumeric})
              } else {
                 orStrings.push({"streetName": {'$regex': ".*" + queryItem + ".*"}});
                 orStrings.push({"city": {'$regex': ".*" + queryItem + ".*"}});
                 orStrings.push({"state": {'$regex': ".*" + queryItem + ".*"}});
                 orStrings.push({"fullStreetAddress": {'$regex': ".*" + queryItem + ".*"}});
                 andQuery.push({"$or": orStrings})
                    }
                }
     );
     Listing.native(function (err, collection) {
         if (err) return res.serverError(err);
         collection.find({"$and": andQuery})
                   .sort({"createdAt": -1})
                   .toArray(function (err, matchedListings) {
                       if (err){
                          return res.serverError(err);
                       } 
                       else {
                          console.log("Continue code")
                       }
                    })
         })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-05
      • 2011-05-15
      • 2013-11-22
      • 1970-01-01
      • 1970-01-01
      • 2014-09-08
      • 2014-09-08
      相关资源
      最近更新 更多