聚合汇总

问题描述 投票:-1回答:1

我们有如下集合-批处理(0,1,2 etc)以块的形式运行作业。每批将有多个具有作业的块/文档。

我们需要为每个批次汇总作业。此后,需要从批次'0'中减去每个批次的作业计数。

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

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

{
    "_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
},

预期输出:

[ 3500,2000,3000]
mongodb aggregation-framework mongodb4.0
1个回答
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

© www.soinside.com 2019 - 2024. All rights reserved.