node.js - Mongodb聚合:Passing arguments to custom function

标签 node.js mongodb express mongodb-query aggregation-framework

这是我的聚合查询

blockColctn.aggregate([{
    "$match": {
        "number": blockNumber
    }

    },
    {
    "$project": {
        "transactions.to": "$transactions.to",
        "transaction": "$transactions",
        "transactions.hash": "$transactions.hash",


    }
    },
    {
    "$lookup": {
        "from": "token_collections",
        "localField": "transactions.to",
        "foreignField": "tokencontractaddress",
        "as": "tokenaccount"
    }
    },
    {
    "$project": {
       "total":getTotal("transactions.hash")
    }
    }])

我在 $project 中调用 getTotal 它工作正常,但是,我想将 transactions.hash 列值作为函数传递争论。 我发现了与我的类似问题Custom functions calculated columns mongodb projection

但它没有说明参数传递

最佳答案

首先要重构上面的内容,首先创建一个函数,该函数将 total 列值作为函数参数并返回管道数组:

const getAggregatePipeline = total => ([
    { "$match": {
        "number": blockNumber
    } },
    { "$project": {
        "transactions.to": "$transactions.to",
        "transaction": "$transactions",
        "transactions.hash": "$transactions.hash",
    } },
    { "$lookup": {
        "from": "token_collections",
        "localField": "transactions.to",
        "foreignField": "tokencontractaddress",
        "as": "tokenaccount"
    } },
    { "$project": { total } }
])

现在您可以将其传递给聚合方法

blockColctn.aggregate(getAggregatePipeline(getTotal("transactions.hash")))

正如您所看到的,我们只是将函数嵌套在彼此内部,以便当使用最终值调用它们时,结果会通过每一层向外爆炸。可以进一步重构,以使用以下蓝图创建所有这些函数的组合(即返回新函数)

const compose = (f1, f2, f3) => value => f1( f2( f3(value) ) )

然后您可以将其称为

const agg = compose(blockColctn.aggregate, getAggregatePipeline, getTotal)("transactions.hash")

对于完全可变的组合函数,即可以采用任意长的函数列表,然后从右到左(从内到外)工作的函数:

const compose = (...fns) => fns.reduce((f, g) => (...args) => f(g(...args)))

关于node.js - Mongodb聚合:Passing arguments to custom function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51024720/

相关文章:

mysql - Grunt 部署/bin/sh : mysql: command not found

javascript - Discord.io 通过 Discord Bot 发送图像 - NodeJS

javascript - Mean.js Node.js 后台进程

node.js - 奇怪的MongoDB连接问题仅在本地主机上

mongodb - 为什么多键索引会阻塞 MongoDB 中的 indexOnly 查询?

node.js - Multer 文件上传错误

node.js - Express/Node 依赖项的模式 : Can I use a separate services file for "app" instance?

node.js - 尝试创建 Vue 应用程序,但在终端中运行命令时获取 "SyntaxError: Unexpected identifier"

javascript - 为什么 onmessage 监听器不处理初始 SSE 事件?

javascript - 获取一个数组中的所有数组元素 mongodb + node.js