我们有一个集合,如下所示-批量'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
答案 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] } } }
}
}])