如何用可选的快速查询参数编写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
,使其只包含在模式中定义的字段。