可选的方法链接,例如排序,限制,跳过

时间:2019-07-03 14:58:03

标签: mongodb sorting mongoose filtering

我正在传递查询参数,猫鼬查询可以使用sortlimitskip的任意组合。

我想到的是根据已传递的参数创建多只猫鼬查询。因此,如果仅传递sort,则结果查询将具有Document.find({}).sort({}),并且如果仅传递limit,则查询将是Document.find({}).limit({})

我应该这样写吗?

router.get('/', (req, res) => {
    if(req.query.sortByPrice) {
        Property.find({})
        .sort({ price: req.query.sortByPrice === 'asc' ? 1 : -1 })
        .populate('user_id', 'name')
        .exec((err, properties) => {
            if (err)
                return res
                    .status(404)
                    .json({ error: "Can't get user details!" });
            res.status(200).json(properties);
        });
    }
    if(req.query.limit) {
        Property.find({})
        .limit(req.query.limit)
        .populate('user_id', 'name')
        .exec((err, properties) => {
            if (err)
                return res
                    .status(404)
                    .json({ error: "Can't get user details!" });
            res.status(200).json(properties);
        });
    }
});

1 个答案:

答案 0 :(得分:1)

您可以从请求正文中创建变量options并将其作为第三个参数传递给.find()查询,而无需使用if-else块编写冗余代码。

.find()查询的第二个参数是projection,因此请不要忘记在此处传递一个空对象。

尝试一下:

let options={};
if(req.params.sortByPrice){
    options.sort = {
        price: req.params.sortByPrice === 'asc' ? 1 : -1 
    }
}
if(req.params.limit){
    options.limit = req.parms.limit
}

Property.find({},{},options)
    .populate('user_id', 'name')
    .exec((err, properties) => {
        if (err)
            return res
                .status(404)
                .json({ error: "Can't get user details!" });
        res.status(200).json(properties);
        return;
    });

注意:不要忘记在res.status().json()之后返回,否则可能会收到错误cant set headers after they are sent。如果您尝试再次发送响应。