【问题标题】:Mongodb aggregation:Passing arguments to custom functionMongodb聚合:将参数传递给自定义函数
【发布时间】:2018-06-25 13:30:52
【问题描述】:

这是我的聚合查询

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相关的类似问题

但它并没有说明参数传递

【问题讨论】:

  • 你在哪里打电话给blockColctn.aggregate()?您可以创建一个可组合的函数,该函数接受聚合和 getTotal 方法
  • 它来自一个函数,你能举个例子吗??

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


【解决方案1】:

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

对于完全可变参数的 compose 函数,即可以获取任意长的函数列表然后从右到左(从内到外)工作的函数:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    • 2013-11-22
    • 2018-07-04
    相关资源
    最近更新 更多