如何用可选的快速查询参数编写Mongoose查询?

我正在Express 4之上build立一个REST API。对于一个path可以说GET /api/users我想查询我的用户集合相应的可选 queryParams。

所以对API的调用可能看起来像这个host:port/api/users?city=Berlin

在这种情况下, name被省略,不影响查询,而city必须匹配。

我设法做到这一点与下面的黑客。 有没有比这更好的方法?

 Users.statics.customFilter = function(qP){ return this.find({ $and: [ {$or: [{undefined: {$eq: qP.city}}, {'city': qP.city}]}, {$or: [{undefined: {$eq: qP.name}}, {'name': qP.name}]} ] }); mongoose.model('User', Users); 

我从这样的mongoose模式调用这个静态函数…

 const User = mongoose.model('User'); app.get('/api/users', (req, res) => { User.customFilter(req.query) .exec((err, results) => { if (err) return next(err); res.json(results); }); }); 

在我看来,实质上, User.find(req.query)应该做你想要的:

 /api/users?city=Berlin → User.find({ city : 'Berlin' }) /api/users?name=John → User.find({ name : 'John' }) /api/users?name=John&city=Berlin → User.find({ city : 'Berlin', name : 'John' }) 

当然,如果没有parameter passing,你必须决定会发生什么(在上面的例子中,这将成为一个匹配所有用户的查询,这可能不是你想要的)。

另外,您应该过滤req.query ,使其只包含在模式中定义的字段。