MongoDB节点驱动程序当前聚合的计数

时间:2016-09-19 14:03:54

标签: javascript node.js mongodb aggregation-framework mongodb-aggregation

我正在使用mongodb作为节点,我正在尝试根据一些设置过滤器聚合一组文档,然后将其限制为10.我将它聚合得很好并且限制很好但我需要得到总数在我将它们限制为10之前汇总的文档。

这是我的代码。

var qry = [];
if (filter.FocusArea && filter.FocusArea != "(None)") {
    qry.push({
        $match: { 'ProgramAreaId': filter.FocusArea }
    });
}
if (filter.Status && filter.Status != "(None)") {
    qry.push({
        $match: { 'StatusId': filter.Status }
    });
}
if (filter.ProgOfficer && filter.ProgOfficer != "(None)") {
    qry.push({
        $match: { 'ProgramOfficerId': filter.ProgOfficer }
    });
}
if (filter.Fund && filter.Fund != "(None)") {
    qry.push({
        $match: { 'FundId': filter.Fund }
    });
}
 var skipNbr = (parseInt(filter.Page) * 10 - 10);
qry.push({ $project: { _id: '$_id', count: { $sum: '$$ROOT' }, content: '$$ROOT'} }) // I would like to do the count here.
qry.push({ $skip: skipNbr })
qry.push({ $limit: 10 })
var apps = mongo.collection('Applications').aggregate(qry, function(err, docs) {
    callback(docs);
});

这可以在一个聚合查询中完成,还是需要拆分为两个?

1 个答案:

答案 0 :(得分:2)

可以在单个查询中执行此操作。

您可以使用$project将过滤后的数组投影到两个不同的字段中:一个包含内容,另一个包含计数。

您可以使用$slice来限制内容数组。

 db.collection.aggregate([
    {
        $match: {} // Filter
    },
    {
        $group: {
            _id: 1,
            array: {$push: '$$ROOT'}
        }
    },
    {
        $project: {
            content: {
                $slice: ['$array', skip, limit]
            },
            total: {
                $size: '$array'
            }
        }
    }
], {allowDiskUse: true})