根据查询参数过滤mongodb记录

时间:2017-07-26 10:20:48

标签: node.js mongodb express

我在Express.js中编写REST API以从mongo数据库中检索一些记录。要获取一组记录,我使用标准的GET请求:

GET localhost:3000/api/books

现在要实现我使用express-api-queryhandler的过滤器。代码如下所示:

routes.use(queryHandler.filter());

[...]

.get((req: any, res: Response) => {
    Book.find(req.where, req.fields, req.options, (err: any, orders: any) => {
        res.status(200).json(books);
    });
});

所以现在当我想要检索一个特定元素时,我可以写出:。

GET localhost:3000/api/books?name=Harry%20Potter

但实施(大于/小于)GT,GTE,LT,LTE功能的最佳方式是什么? Node.js有什么好的库吗?我只在Loopback文档中找到了where函数,但是可以在Express中使用Loopback吗?

我可以手动编写所有内容,但这不是一个好的解决方案。提前谢谢。

编辑: 我在前面提到的包中编辑了filter.js文件,以便它可以与gt,lt,gte,lte一起使用。它看起来很安全,但也许有更好的选项可以进行更多验证?

function filter (query, skip) {
    var filters = {};
    var k;

    var SKIP_KEYS = [
        'fields',
        'limit',
        'offset',
        'sort'
    ].concat(skip);

    for (k in query) {
        if (SKIP_KEYS.indexOf(k) === -1) {
            var param = query[k];
            // Added part
            if(param.startsWith("gte_")) param = {"$gte": param.substr(4)}
            else if(param.startsWith("lte_")) param = {"$lte": param.substr(4)}
            else if(param.startsWith("gt_")) param = {"$gt": param.substr(3)}
            else if(param.startsWith("lt_")) param = {"$lt": param.substr(3)}
            // End of added part

            console.log(param);
            filters[k] = param;
        }
    }

    return filters;
}

module.exports = function (options) {
    var o = options || {};

    return function (req, res, next) {
        req.where = filter(req.query, o.skip);
        next();
    };
};

0 个答案:

没有答案