Mongodb聚合:将参数传递给自定义函数

时间:2018-06-25 13:30:52

标签: 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")
    }
    }])

我在getTotal中调用$project可以正常工作,但是,我想将transactions.hash列值作为函数参数传递。 我发现了与我的Custom functions calculated columns mongodb projection

相关的类似问题

但这并不能说明参数传递

1 个答案:

答案 0 :(得分:2)

首先要重构上面的内容,首先创建一个函数,该函数将列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)))