Поисковая система, подобная MongoDB Yelp, местоположение категория

#javascript #node.js #mongodb #express

#javascript #node.js #mongodb #экспресс

Вопрос:

Я создаю приложение, похожее на Yelp, используя MongoDB, Express, JS и Node. Выполнив поиск, я смог найти способ поиска по нескольким полям схемы кампуса (кампусы, рестораны, парикмахерские, название). Теперь я хочу уточнить поиск по местоположению (например, рестораны / бизнес в Лос-Анджелесе), и мне нужна помощь в этом. Вот что я пробовал до сих пор:

Я попробовал команды $ и / $ or для Mongo. Когда я просто использую $or, я могу выполнять поиск по имени или местоположению.

Маршрут

 router.get("/campus", function(req, res){
var noMatch = null;
if(req.query.search){
    const regex = new RegExp(escapeRegex(req.query.search), 'gi');
    Campus.find({$and:[
        {$or: [{name: regex}, {location:regex},  {food: regex},  
               {cost: regex}, {category:regex}]} ,
        {$or: [{location: regex}]},
        ]},
        function(err, allCampuses){
    if(err){
        console.log(err);
    } else {
        if(allCampuses.length < 1){
            req.flash("error", "No campus match that search, please try 
                       again.");
            return res.redirect("back");
            // noMatch = "No campus match that query, please try again.";
        }
        res.render("campus/index", {campus:allCampuses, currentUser: 
                                    req.user, noMatch: noMatch});
    }
})
} else{
//get all campus from DB
Campus.find({}, function(err, allCampuses){
    if(err){
        console.log(err);
    } else {
        res.render("campuses/index", {campus:allCampuses, currentUser: 
                    req.user, noMatch: noMatch});
    }
})
}
})
 

HTML

 
    <div class="container">
   <header id="coverImage" class="jumbotron img-fluid">
       <div class="container">
            <h1>Welcome to CampusFinder</h1>
            <p>View our hand-picked Campuses</p>
            <p>
               <a class="btn btn-primary btn-lrg" href="/bizs/new">Add New Campus</a>
           </p>
            <p>
             <form action="/campuses" method="GET" class="form-inline">
                 <div class="form-group" > 
                    <input type="text" name="search" placeholder="campuses 
                                          search" class="form-control">
                    <input type="submit" value="Search" class="btn btn default">
                 </div>
                 <div class="form-group">
                     <label for="location">Location</label>
                     <input class="form-control" type="text" name="location" id="location" placeholder="Florida">
                 </div>
             </form>
            </p>
       </div>
    </header>

 

Я ожидаю, что результат будет работать как Yelp. Когда я выбираю местоположение и ищу кампус, кампусы этого города будут заполнены.

Комментарии:

1. Какую ошибку вы видите?

2. Я не получаю сообщение об ошибке. Это просто не работает. Я бы искал город, который у меня есть в базе данных, и поиск ничего не даст.

Ответ №1:

Я думаю, вам следует исключить {location:regex} из первого условия и использовать другой параметр для определения местоположения ввода, чтобы указать второе предложение AND .

   {
    $and: [
      {
        $or: [
          { name: regex },
          { food: regex },
          { cost: regex },
          { category: regex }
        ]
      },
      { location: locationRegex }
    ]
  }
 

Комментарии:

1. Это не сработало. Результаты поиска оказываются пустыми. Это функция регулярных выражений, которую я вызываю в своем первом коде: function escapeRegex(text) { return text.replace(/[-[]{}()* ?.,\^$|#s]/g, "\$amp;"); };