汇总汇总

时间:2020-02-19 16:07:18

标签: mongodb aggregation-framework mongodb4.0

我们有一个集合,如下所示-批量'0'分批运行作业。
每一批将有多个具有作业的块/文档。

我们需要为每个批次汇总作业。
此后,需要从批次{ "_id": ObjectId("xxxxxx"), "batch": ["0"], "jobs":2500 }, { "_id": ObjectId("xxxxxx"), "batch": ["1"], "jobs":1500 }, { "_id": ObjectId("xxxxxx"), "batch": ["0"], "jobs":1500 }, { "_id": ObjectId("xxxxxx"), "batch": ["2"], "jobs":3500 }, { "_id": ObjectId("xxxxxx"), "batch": ["1"], "jobs":500 }, { "_id": ObjectId("xxxxxx"), "batch": ["0"], "jobs":1500 }, { "_id": ObjectId("xxxxxx"), "batch": ["3"], "jobs":2500 }, 的工作量中减去每批次的工作量。

结果将是每个批次与批次0的作业计数差异的数组/集合。
如果有“ x”个批次,则数组的大小显然将为x-1。

这可以在单个聚合操作中完成吗?

[ 3500,2000,3000]

预期输出:

h5

1 个答案:

答案 0 :(得分:0)

您可以尝试以下方法:

db.collection.aggregate([
    { $unwind: '$batch' },
    { $group: { _id: '$batch', count: { $sum: '$jobs' } } },
    { $group: { _id: '', data: { $push: '$$ROOT' } } },
    {
        $addFields: {
            value: { $filter: { input: '$data', as: 'e', cond: { $eq: ['$$e._id', '0'] } } }
        }
    },
    {
        $project: {
            _id: 0,
            data: { $filter: { input: { $map: { input: '$data', as: 'e', in: { $subtract: [{ $arrayElemAt: ['$value.count', 0] }, '$$e.count'] } } }, as: 'e', cond: { $ne: ['$$e', 0] } } }
        }
    }])

测试: MongoDB-Playground