这是我的聚合查询
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/