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