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

问题描述 投票:0回答:2

我正在 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);
        });
    });
node.js mongodb rest express mongoose
2个回答
9
投票

在我看来,本质上,

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参数会发生什么(在上面的示例中,它将成为匹配all用户的查询,这可能不是您想要的)。

此外,您可能应该过滤

req.query
,以便它仅包含架构中定义的字段。


0
投票

因为我找不到答案,我将向您展示我是如何解决的。我从 req.query 对象获取参数。在这里,我添加了另外 2 个查询,在我的情况下应该始终存在。

const query = {...req.query, surveyID: id_s, surveyEntityID: id_e};

然后我使用猫鼬:

let allAnswers = await Answer.find(query);
© www.soinside.com 2019 - 2024. All rights reserved.