Mongo Aggregate问题

时间:2018-02-05 14:53:25

标签: mongodb mongodb-query aggregation-framework aggregate-functions

这是我在mongodb中的数据

{
    "_id" : ObjectId("5a77e82c19e5b90363fe55d4"),
    "serviceId" : 85,
    "clusterId" : 122,
    "metricTimestamp" : ISODate("2018-02-05T04:33:58.000Z"),
    "metricNames" : [ 
        "host", 
        "count", 
        "time", 
        "out"
    ],
    "metricValues" : [ 
        "wwe.123.com", 
        "8829", 
        "2018-02-05T04:16:02.685Z", 
        "25327782"
    ],
    "createtime" : ISODate("2018-02-05T05:14:20.273Z")
}

我希望聚合数据:

db.getCollection('metrics.value').aggregate([
    { $match: {
        'serviceId': 85, 
        'metricTimestamp':{ 
            $gte: ISODate("2018-02-03T04:33:58"),
            $lte: ISODate("2018-02-05T04:33:58")
        }
    }},
    { $project: {
        host: { $arrayElemAt:["$metricValues", 0]}, 
        count:{ $arrayElemAt:["$metricValues", 1]}
    },
    {$group:{}}
}])

我想按主持人分组(这里是" wwe.123.com"),并汇总计数(这里是" 8829")。我不知道如何从字符串转换为int(parseInt不工作)。请帮我解决这些问题。

1 个答案:

答案 0 :(得分:0)

db.getCollection('foo').aggregate([
    { $match: 
      { "serviceId" : 85, 
        "metricTimestamp" : 
         {  $gte: ISODate("2018-02-05T04:33:58.000Z"), 
            $lte: ISODate("2018-02-05T04:33:58.000Z") }}},
     { $project :  
       { "_id" : 0, 
         "host" : { $arrayElemAt:["$metricValues", 0] }, 
         "count" : { $arrayElemAt:["$metricValues", 1] }}},

    ])

输出:

{
    "host" : "wwe.123.com",
    "count" : "8829"
}

然后在$group之后$projection,您需要将count字段转换为int。如何做到这一点已经被问及并回答here。将字段转换为int后,只需在$projection

后添加此代码段即可
{ $group : { _id : "$host", count : { $sum : "$count"}}}