Mongodb Mongo多级聚合组
在整体解卷后,给出以下数据:Mongodb Mongo多级聚合组,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,在整体解卷后,给出以下数据: let workOrders = [ {customer: 'A', job: 'Apple', chemical: {name: 'Chem A', quantity: 500}}, {customer: 'A', job: 'Banana', chemical: {name: 'Chem B', quantity: 400}}, {customer: 'A', job: 'Banana', chemical: {name: 'Chem C
let workOrders = [
{customer: 'A', job: 'Apple', chemical: {name: 'Chem A', quantity: 500}},
{customer: 'A', job: 'Banana', chemical: {name: 'Chem B', quantity: 400}},
{customer: 'A', job: 'Banana', chemical: {name: 'Chem C', quantity: 300}},
{customer: 'B', job: 'Cherry', chemical: {name: 'Chem A', quantity: 200}}
]
所需产出:
[
{
customer: 'A',
jobs: [
{
job: 'Apple',
chemicals: [
{name: 'Chem A', quantity: 500}
]
},
{
job: 'Banana',
chemicals: [
{name: 'Chem B', quantity: 400},
{name: 'Chem C', quantity: 300}
]
}
]
},
{
customer: 'B',
jobs: [
{
job: 'Cherry',
chemicals: [
{name: 'Chem A', quantity: 200}
]
}
]
}
]
我知道如何使用组并首先按客户分组,但我不知道如何在不打乱初始客户组的情况下制作嵌套的化学品阵列
我试过这样的东西,但它不喜欢内部$push
{
“$group”:{
“_id”:“$customer”,
“团体”:{
$push:{
“集团数据”:“$customer”,
“组计数”:{$sum:$customer},
“小组儿童”:{
$push:{
“组数据”:“$job”,
“组计数”:{$sum:$job},
“儿童组”:{
$push:{
“组数据”:“$chemical.name”,
“组计数”:{$sum:$chemical.name”}
}
}
}
}
}
}
}
还要添加每个客户和每个作业的总数量要制作嵌套化学品,您只需要两个
$group
阶段:
db.collection.aggregate([
{
$group: {
_id: { customer: "$customer", job: "$job" },
chemicals: { $push: "$chemical" },
jobTotal: { $sum: "$chemical.quantity" }
}
},
{
$group: {
_id: "$_id.customer",
jobs: { $push: { job: "$_id.job", jobTotal: "$jobTotal", chemicals: "$chemicals" } },
customerTotal: { $sum: "$jobTotal" }
}
},
{
$project: {
_id: 0,
customer: "$_id.customer",
customerTotal: 1,
jobs: 1
}
}
])
如果我想得到每个客户和作业的化学量总和和平均值,我该如何实现?需要客户的总和=1200,还需要乔布斯的苹果总和=500,乔布斯的香蕉总和=700?@user1779362修改了我的回答。我最后做了3组,使用所有3个作为id,然后2个然后1个,一边移动一边将数组堆叠在里面。这样我就可以从每种化学物质下面收集更多的数据。你的例子教会了我需要什么,谢谢
db.collection.aggregate(
// Pipeline
[
// Stage 1
{
$group: {
_id:{job:'$job'},
chemicals:{$push:'$chemical'},
docObj:{$first:'$$CURRENT'}
}
},
// Stage 2
{
$group: {
_id:{customer:'$docObj.customer'},
jobs:{$push:{job:'$_id.job',chemicals:'$chemicals'}}
}
},
// Stage 3
{
$project: {
customer:'$_id.customer',
jobs:1,
_id:0
}
},
]
);