【问题标题】:How to isolate database services from pagination and filtering如何将数据库服务与分页和过滤隔离
【发布时间】:2019-11-28 16:44:56
【问题描述】:

我正在从事一个相对较大的项目,该项目有很多服务和查询数据库。在大多数服务中,都有过滤结果搜索的功能strong> 在文档或分页中。

我想知道如何拥有一个函数或模块来处理所有服务中的所有搜索,而不必在所有服务中编写相同(有点相同)的代码。

例如,我有一个返回流行歌曲的功能:

module.exports.get_trending_songs = async (req, res, next) => {
        var searchParams = {}
        var sortParams = {}
        if (req.query.search) {
            searchParams = {
                name: new RegExp('.*' + req.query.search + '.*', "i")
            }
        }
        if (req.query.sort) {
            sortParams = (req.query.order == 1 ? '' : '-') + req.query.sort
        }
        var songs
        songs = await Song.find(searchParams)
            .limit(parseInt(req.query.limit))
            .skip(parseInt(req.query.skip))
            .sort(sortParams)
            .exec()
}

我有一个返回用户的函数:

module.exports.get_users = async (req, res) => {
    var searchParams = {}
    var sortParams = {}
    if (req.query.search != undefined) {
        searchParams = {
            name: new RegExp('.*' + req.query.search + '.*', "i")
        }
    }
    if (req.query.sort != undefined) {
        sortParams = (req.query.order == 1 ? '' : '-') + req.query.sort
    }
    var users = await User.find(searchParams)
        .select('-password')
        .limit(parseInt(req.query.limit))
        .skip(parseInt(req.query.skip))
        .sort(sortParams)
        .exec()
}

如您所见,它们几乎相同! (假设我通过执行相同的查询并添加.count() 来返回分页内容(如nPages 或countOfDocs)

在其他模块中处理所有副查询(分页、搜索等)并使服务只关注主查询的最佳方式是什么?不是

【问题讨论】:

    标签: node.js mongodb rest mongoose


    【解决方案1】:

    那些 Mongoose 函数返回一个 Query object ,您可以轻松地传递它......所以您可以编写一个函数来接收一些东西(如 Model 和 req 参数)并执行所有常用方法,然后执行exec() 在 main 方法中,这样你就可以添加任何额外的东西(比如从返回的字段中删除密码)。

    这是一个可行的例子,但是我没有测试过这个...所以你可能需要修改它。

    function build_query = function(model, reqParams) {
        var searchParams = {}
        var sortParams = {}
        if (reqParams.search != undefined) {
            searchParams = {
                name: new RegExp('.*' + reqParams.search + '.*', "i")
            }
        }
        if (reqParams.sort != undefined) {
            sortParams = (reqParams.order == 1 ? '' : '-') + reqParams.sort
        }
        var query = model.find(searchParams)
            .select('-password')
            .limit(parseInt(reqParams.limit))
            .skip(parseInt(reqParams.skip))
            .sort(sortParams)
        return query
    }
    
    module.exports.get_users = async (req, res) => {
        var query = build_query(User, req.query)
        var users = await query.select('-password').exec()
    }
    
    module.exports.get_trending_songs = async (req, res, next) => {
        var query = build_query(Song, req.query)
        var songs = await query.exec()
    }
    

    【讨论】:

    • 感谢您的回答,我知道这是最好的方法,但我在将其实施到我的项目时遇到了问题。示例非常简单,我的服务非常复杂,我执行一些查询以获得结果,现在我想过滤该结果..就像在已经调用 find() 的查询上调用 find() 一样。为答案+1,我将等待听到其他意见
    • 我想知道查询和编写完全相互独立的服务的最佳方式,我找不到一个大型生产节点应用程序来查看它们是如何处理的所有的查询和搜索和过滤
    • 是的,这对于每个应用程序都是独一无二的。 IMO,这种方法适用于大多数应用程序,但显然不是全部。祝你好运!
    猜你喜欢
    • 2021-04-07
    • 1970-01-01
    • 2015-10-14
    • 1970-01-01
    • 2020-06-05
    • 1970-01-01
    • 2011-06-18
    • 2015-08-02
    • 2012-06-29
    相关资源
    最近更新 更多