我正在运行MongoDB查询,并尝试更改输出的结构方式。当前看起来如下:
[
{
qClass: [
{
cat: 'Servers',
class: 'High Impact Maintenance',
total: 1
},
{
cat: 'Network.TrafficShapers',
class: 'Maintenance',
total: 16
},
{
cat: 'Network.Hop',
class: 'Core Failure',
total: 2
},
{
cat: 'Office.MFD',
class: 'Failure',
total: 4
},
{
cat: 'Office.Printers',
class: 'Maintenance',
total: 36
},
{
cat: 'Office.MFD',
class: 'Maintenance',
total: 880
},
{
cat: 'Network.TrafficShapers',
class: 'Failure',
total: 47
},
{
cat: 'Servers',
class: 'Core Maintenance',
total: 1
},
{
cat: 'Network.Switches',
class: 'Failure',
total: 5
},
{
cat: 'Servers',
class: 'Performance',
total: 21
},
{
cat: 'Network.Switches',
class: 'High Impact Failure',
total: 4
},
{
cat: 'Network.Firewall',
class: 'Core Failure',
total: 2
},
{
cat: 'Network.Router',
class: 'Failure',
total: 53
},
{
cat: 'Servers',
class: 'High Impact Failure',
total: 3
},
{
cat: 'Office.Printers',
class: 'Performance',
total: 1
},
{
cat: 'Network.TrafficShapers',
class: 'Performance',
total: 3
},
{
cat: 'Network.Switches',
class: 'Maintenance',
total: 1
},
{
cat: 'Servers',
class: 'Failure',
total: 60
},
{
cat: 'Network.Router',
class: 'Performance',
total: 67
},
{
cat: 'Network.Router',
class: 'High Impact Failure',
total: 39
},
{
cat: 'Office.MFD',
class: 'Performance',
total: 5
},
{
cat: 'Network.TrafficShapers',
class: 'High Impact Failure',
total: 593
},
{
cat: 'Network.Router',
class: 'Maintenance',
total: 78
},
{
cat: 'Office.Printers',
class: 'High Impact Failure',
total: 2
},
{
cat: 'Office.Printers',
class: 'Failure',
total: 1
},
{
cat: 'Office.MFD',
class: 'Critical Failure',
total: 48
}
]
}
]
我希望它的结构如下:
{
cat: 'Servers',
High Impact Maintenance: 1,
Performance: 24,
Total: 25
}
因此,基本上,关于cat(category)的所有信息都在同一数组中,并且字段名称对于该类是动态的。下面是我为此使用的查询:
db.full_ticket_lists.aggregate(
{
$facet: {
qClass: [
{$match : {"device":{$ne:null},"status":"Open","ticket_class":{$ne:''}}},
{$lookup: { from: "devices", localField: "device", foreignField: "_id", as: "device_link"},},
{$lookup: { from: "device_categories", localField: "device_link.device_category", foreignField: "_id", as: "category_link"},},
{$unwind: "$category_link"},
{$group : {
_id:{"class_name":"$ticket_class", "cat_name":"$category_link.name"},
count: {$sum:1}
},},
{$project:{_id:0,cat:"$_id.cat_name", class:"$_id.class_name",total:"$count"}}
],
}
}
)
答案 0 :(得分:0)
逐步查看,关注您的预期结果,
i
{
"cat": 'Servers',
"High Impact Maintenance": 1,
"Performance": 24,
"Total": 25
}
$unwind
,因为它是一个数组,我们需要$ group部分下面的每个对象qClass
由$group
和cat
以将classes
推为k(键),将class
推为v(值)total
来推送所有total
的总和total
db.collection.aggregate([
{
$unwind: "$qClass"
},
{
$group: {
_id: "$qClass.cat",
cat: {
$first: "$qClass.cat"
},
classes: {
$push: {
k: "$qClass.class",
v: "$qClass.total"
}
},
total: {
$sum: "$qClass.total"
}
}
},
和第二个$$ROOT
从数组转换为对象$classes
数组转换为对象,并将k(key)和v(value)转换为对象classes
{
$replaceRoot: {
newRoot: {
$mergeObjects: [
"$$ROOT",
{
$arrayToObject: "$classes"
}
]
}
}
},
将隐藏不需要的字段(0 =隐藏,1 =显示),因此这里$project
和_id
被隐藏了,两者都不再需要< / li>
classes