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

时间:2016-05-12 18:50:12

标签: node.js mongodb rest express mongoose

我正在Express 4上构建一个REST API。对于一个路径,我可以说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);

我正在从像这样的猫鼬模式中调用这个静态函数...

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

1 个答案:

答案 0 :(得分:5)

在我看来,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' })

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

此外,您应该过滤req.query,因此它只包含您的架构中定义的字段。