monogdb中的$ facet聚合

时间:2018-05-11 14:06:10

标签: mongodb aggregation-framework

我的样本数据如下所示:

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),

1 个答案:

答案 0 :(得分:1)

您应该尝试使用$facet聚合来获得所需的结果,该结果非常简单,可以使用limitskip ...

您可以查看输出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" }}
])