我的样本数据如下所示:
Category response
Privacy 1
Mobile 1
Privacy 1
Privacy 0
Phishing 1
Mobile 1
Desktop 1
Desktop 0
Security 1
我已经为group
所有categories
创建了一个汇总查询,并获得如下计数:
db.cmi5DashboardData.aggregate([
{$group:{_id:'$category',knt:{$sum:'$response'}}},
{$sort:{knt:-1}},
{$project:{_id:0,category:'$_id',count:'$knt'}}
])
我得到如下输出:
Category count
Privacy 2
Mobile 2
Phishing 1
Desktop 1
Security 1
但是,我需要group
将此数据提升到下一级,以获得如下输出:
Category count
Privacy 2
Mobile 2
Others 3
此处,前两个类别(具有更高的计数,即隐私和移动)被认为是强大的,其余所有类别都被假设为弱点并称为其他类别。 Others
应该动态计算,这是除强数据点之外的所有其他数据点的添加。
有关这方面的任何建议或指示可能会有所帮助吗?
注意:我正在使用mongodb 3.6
更新:JSON示例
{Category:'Phishing', response:1),
{Category:'Security', response:1),
{Category:'Privacy', response:1),
{Category:'Privacy', response:1),
{Category:'Privacy', response:0),
{Category:'Mobile', response:1),
{Category:'Mobile', response:1),
{Category:'Desktop', response:1),
{Category:'Desktop', response:0),
答案 0 :(得分:1)
您应该尝试使用$facet
聚合来获得所需的结果,该结果非常简单,可以使用limit
和skip
...
您可以查看输出here
db.collection.aggregate([
{ "$facet": {
"top": [
{ "$group": {
"_id": "$Category",
"response": { "$sum": "$response" }
}},
{ "$sort": { "response": -1 }},
{ "$limit": 2 }
],
"rest": [
{ "$group": {
"_id": "$Category",
"response": { "$sum": "$response" }
}},
{ "$sort": { "response": -1 }},
{ "$skip": 2 },
{ "$group": {
"_id": "Others",
"response": { "$sum": "$response" }
}}
]
}},
{ "$project": { "data": { "$concatArrays": ["$top", "$rest"] }}},
{ "$unwind": "$data" },
{ "$replaceRoot": { "newRoot": "$data" }}
])