这是我的汇总查询
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
但这并不能说明参数传递
答案 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)))