mongoDB aggregate实践

一、mongoDB准备数据

db.getCollection('test').insert({ "_id" : "7", "column_id" : "2", "metadata":{ "status" : true, "cp" : "1", "sp" : "2" }, "duration" : 1000 }) 
...

  查看数据duration:1000.0不符合预期,需要在insert时指定类型"duration" : NumberInt(1000)

二、mongoDB aggregate实践

  根据column_id,status,cp分组;duration求和;获取count数;根据status降序排序,cp升序排序。

db.getCollection('test').aggregate(
  [
    {$group: {"_id" : {"column_id": "$metadata.column_id", "status": "$metadata.status", "cp": "$metadata.cp"}, duration: {$sum: "$duration"}, count : {$sum : 1}}},
    {$project: {"_id": 1, "duration": 1, "count": 1}},
    {$sort: {"_id.status": -1, "_id.cp": 1}}
  ]
)

  返回结果count是float类型,并不是int类型,需要指定类型"count": NumberInt(1)

/* 1 */
{
    "_id" : {
        "column_id" : "2",
        "status" : true,
        "cp" : "1"
    },
    "duration" : 2000,
    "count" : 2
}

/* 2 */
{
    "_id" : {
        "column_id" : "1",
        "status" : true,
        "cp" : "1"
    },
    "duration" : 2000,
    "count" : 2
}
...

三、mongoTemplate aggregate实践

  使用mongoTemplate.aggregate(Aggregation aggregation, String collectionName, Class<O> outputType)方法返回数据,可以通过aggregationResults.getMappedResults()获得List<Map>数据,也可以通过aggregationResults.getMappedResults()获取数据,只是获取数据的过程比较复杂,在这里不使用。

  AggregationOperation aggregationOperation = Aggregation.group("metadata.column_id", "metadata.status", "metadata.cp")
                .sum("duration").as("duration").count().as("count");

  AggregationOperation sort = Aggregation.sort(new Sort(Sort.Direction.DESC, "_id.status"))
                .and(new Sort(Sort.Direction.ASC, "_id.cp"));
  Aggregation aggregation = Aggregation.newAggregation(aggregationOperation, sort);

  AggregationResults<Map> results = mongoTemplate.aggregate(aggregation, "navigation_test", Map.class);

  List<Map> datas = results.getMappedResults();
  for (Map data : datas){
    System.out.println(data);
  }

四、参考文档

  https://docs.mongodb.com/manual/reference/operator/aggregation/

  https://www.runoob.com/mongodb/mongodb-aggregate.html

转载于:https://my.oschina.net/junruiwang/blog/3055624

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值