如何Mongo只查询在搜索表单中输入的字段?

时间:2016-02-23 04:54:52

标签: mongodb search express mongodb-query mean-stack

我有一个充当过滤器的搜索表单。我只希望输入内容的字段用于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堆栈。

1 个答案:

答案 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  })

希望这会有所帮助。