MongoDB按子集的总和排序

时间:2013-11-20 13:56:37

标签: mongodb sorting sum

我有以下系列:

error_reports
[    
    {
       "_id":{
          "$oid":"5184de1261"
       },
       "date":"29/04/2013",
       "errors":[
          {
             "_id":"10",
             "failures":2,
             "alerts":1,
          },
          {
             "_id":"11",
             "failures":7,
             "alerts":4,
          }
       ]
    },
    {
       "_id":{
          "$oid":"5184de1262"
       },
       "date":"30/04/2013",
       "errors":[
          {
             "_id":"15",
             "failures":3,
             "alerts":2,
          },
          {
             "_id":"16",
             "failures":9,
             "alerts":1,
          }
       ]
    }
]

是否可以检索出现故障的文档列表和按降序排序的故障排序?我是mongodb的新手,我一直在寻找2天,但我无法弄清楚什么是正确的查询......

我试过这样的事情:

db.error_reports.aggregate(
    { $sort : { failures: -1} },
    { $group:
        { _id: "$_id",
        failures: { "$sum": "$errors.failures" }
        }
    }
);

但它不起作用,我认为这是因为$sum$errors.failures的事情,我想在day_hours子集合的每个项目上总结这个属性,但我不知道在查询中这样做...

1 个答案:

答案 0 :(得分:5)

你的尝试非常接近。唯一缺少的是$unwind aggregation operator$unwind基本上根据子文档拆分每个文档。因此,在对故障和警报进行分组之前,您可以解除错误,如下所示:

db.error_reports.aggregate(
  { $unwind : '$errors' },
  { $group : {
    _id : '$_id',
    'failures' : { $sum : '$errors.failures' },
    'alerts' : { $sum : '$errors.alerts' }
  } },
  { $sort : { 'failures': -1 } }
);

它为您提供以下结果:

{
    "result" : [
        {
            "_id" : ObjectId("5184de1262"),
            "failures" : 12,
            "alerts" : 3
        },
        {
            "_id" : ObjectId("5184de1261"),
            "failures" : 9,
            "alerts" : 5
        }
    ],
    "ok" : 1
}