我有一个充当过滤器的搜索表单。我只希望输入内容的字段用于Mongo查询。
这是我的后端Routes.js。如果用户没有为seat_price_static输入任何内容,则此.find()不应尝试匹配$和两个参数。
// Routes.js from backend
app.get('/search', function(req, res, next){
Trip.find({
$and: [
{seats_remaining: {$gte: req.query.seats_remaining}},
{seat_price_static: {$lte: req.query.seat_price_static}}
]
}, function(err, trips){
if(err){return next(err)};
return res.json(trips);
});
});
我如何设置这种灵活性?
// ============================================= ====================== // // ==================如果需要,还有一些额外的信息====================== // < / p>
这是我的前端搜索字段。如果只输入了seat_remaining,那么我希望Mongo查询忽略seat_price_static字段。
// searchForm.html
<input type='number' ng-model='search.seats_remaining'>
<input type='number' ng-model='search.seat_price_static'>
<button ng-click='searchIt(search)'>Search</button>
这是我的客户端Controller.js。如您所见,它将search
对象发送到后端。
// Controller.js from front-end client
App.controller('appCtrl', function($scope, $http){
$scope.searchIt = function(search){
$http.get('http://localhost:3000/search', {params: search})
.then(function(data){
console.log('Got the search results ' + data);
}, function(err){
console.log(err);
});
}
};
我正在使用MEAN堆栈。
答案 0 :(得分:2)
您不必使用$and
。您在查询文档中提供的逗号分隔键值对是隐式 ANDed
现在针对您的情况,您可以做的是创建查询文档。之后,检查req.query
是否包含seat_remaining和seat_price_static值。如果是,请将它们添加到查询文档中。
如果不离开他们。像这样:
var query = {};
if(req.query.seats_remaining) query.seats_remaining = {$gte: {req.query.seats_remaining }};
对req.query seat_price_static执行相同的操作。
然后:
Trip.find(query, function(err, trips){ //your code to handle the response from MongoDB })
希望这会有所帮助。