用于可选$ match管道运算符的Mongodb Aggregation Append方法

时间:2015-04-28 04:08:59

标签: node.js mongodb aggregation-framework

我使用nodejs + mongoosejs和mongodb 2.6。我在模型上有一个静态函数,它对集合中所有项的值求和。使用projectNo属性将每个项目分配给项目。我需要静态函数能够为集合提供总计,如果传递了projectNo参数,则向聚合添加$ match管道运算符。这将使我免于必须制作两个基本上做同样事情的静态函数。

为了增加一些东西,我使用bluebird promisifyAll方法使聚合框架返回一个承诺。

我的静态函数,它对整个集合进行求和:

db.collection.aggregateAsync([ {$group:{_id: null, amount: { $sum: "$amount" }}} ])

我的静态函数,它只对具有匹配项目的记录求和:

db.collection.aggregateAsync([ {$match: { projectNo: projectNo }}, {$group:{_id: null, amount: { $sum: "$amount" }}} ])

我真的只想在包含req.params.projectNo的情况下使用Aggregate.append方法附加$ match管道。

当我尝试将其添加到异步聚合时,会出现错误,这是有道理的,因为它只是一个承诺。如果我试试这个:

db.collection.aggregateAsync([ {$group:{_id: null, amount: { $sum: "$amount" }}} ]).then(function(aggregate){ aggregate.append({$match: { projectNo: projectNo }}) })

我收到错误,(追加未定义)。我该怎么做呢?或者只是因为我有两个功能可以做同样的事情?

1 个答案:

答案 0 :(得分:2)

我在mongodb中阅读了源代码,以确切了解如何使用aggregate.append方法。如果使用链式方法构建聚合,则可以使用append添加任何管道操作。

所以我做的是将聚合管道数组放入数组中。如果有一个projectNo然后我使用unshift()将$ match管道添加到数组。我使用unshift因为你通常希望$ match管道首先限制记录数,然后进行其余的管道操作。

var pipeline = [{$group:{_id: null, amount: { $sum: "$amount" }}}];
if(req.params.projectNo){
    pipeline.unshift({$match: { projectNo: req.params.projectNo }});
}
db.collection.aggregateAsync(pipeline);

我通常会让事情变得比我需要的更复杂......