设为首页 加入收藏

TOP

MongoDB聚合Group(一)(一)
2015-11-21 01:53:21 来源: 作者: 【 】 浏览:2
Tags:MongoDB 聚合 Group

一.简介

db.collection.group()使用java script,它受到了一些性能上的限制。大多数情况下,$ group在Aggregation Pipeline提供了一种具有较少的限制适用的替代。可以通过指定的键的集合中的文档和执行简单的聚合函数。在2.2版本中,返回的数组可以包含最多20000个元素;即最多20000个独特的分组。

我们比较熟悉的group by 的sql语句select key from table groupby key,而mongoDB没提供SQL那样通过Group By就轻松实现数据库的分组功能,我们通过接口来实现的

db.collection.group({ key, reduce, initial[, keyf] [, cond] [, finalize] })

key

作为分组的key

reduce

一个聚合函数操作文档的分组操作期间。这些函数可以返回一个sum或count。该函数接受两个参数:当前文档和这个群体聚集的结果文档。

initial

初始化聚合结果文档变量,为空时自动为每列提供初始变量。

keyf

可选。替代的key 字段。指定一个函数创建一个“key object”作为分组的key。使用keyf而是通过group by领域而不是现有的文档域键组。

cond

过滤条件

finalize

在db.collection.group()返回最终结果之前,此功能可以修改的结果文档或替换的结果文档作为一个整体。

二.Mongo VUE操作Group By

1.MonogoDB数据库中添加了订单的数据

/* 0 */
{
 "_id" : ObjectId("552a330e05c27486b9b9b650"),
 "_class" : "com.mongo.model.Orders",
 "onumber" : "002",
 "date" : ISODate("2014-01-03T16:03:00Z"),
 "cname" : "zcy",
 "item" : {
   "quantity" : 1,
   "price" : 4.0,
   "pnumber" : "p002"
  }
}
 
/* 1 */
{
 "_id" : ObjectId("552a331d05c275d8590a550d"),
 "_class" : "com.mongo.model.Orders",
 "onumber" : "003",
 "date" : ISODate("2014-01-04T16:03:00Z"),
 "cname" : "zcy",
 "item" : {
   "quantity" : 10,
   "price" : 2.0,
   "pnumber" : "p001"
  }
}
 
/* 2 */
{
 "_id" : ObjectId("552a333105c2f28194045a72"),
 "_class" : "com.mongo.model.Orders",
 "onumber" : "003",
 "date" : ISODate("2014-01-04T16:03:00Z"),
 "cname" : "zcy",
 "item" : {
   "quantity" : 30,
   "price" : 4.0,
   "pnumber" : "p002"
  }
}
 
/* 3 */
{
 "_id" : ObjectId("552a333f05c2b62c01cff50e"),
 "_class" : "com.mongo.model.Orders",
 "onumber" : "004",
 "date" : ISODate("2014-01-05T16:03:00Z"),
 "cname" : "zcy",
 "item" : {
   "quantity" : 5,
   "price" : 4.0,
   "pnumber" : "p002"
  }
}

2.MongoDB实现分组并统计

1)我们要对日期和产品编码进行分组,并计算相同的产品的数量

Sql语句:Select date, pnumber,sum(quantity) as total from orders,items group by date, pnumber(少了两张表的关联的条件)

MongoDB:

db.orders.group({

key: { date:1,'item.pnumber':1},

initial : {"total":0},

reduce : function Reduce(doc, out) {

out.total+=doc.item.quantity

} });

结果:

\

2)实现一天卖出了多少个产品,金额是多少,平均价格是多少

db.Z??http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcmRlcnMuZ3JvdXAoezwvcD4KPHA+ICAgICAgIGtleToge2RhdGU6MX0sIDwvcD4KPHA+ICAgICAgaW5pdGlhbCA6eyZxdW90O3RvdGFsJnF1b3Q7OjAsJnF1b3Q7bW9uZXkmcXVvdDs6MH0sIDwvcD4KPHA+ICAgICByZWR1Y2UgOiBmdW5jdGlvbiBSZWR1Y2UoZG9jLCBvdXQpIHs8L3A+CjxwPiAgICAgb3V0LnRvdGFsJiM0Mzs9ZG9jLml0ZW0ucXVhbnRpdHk7PC9wPgo8cD4gICAgICAgICAgb3V0Lm1vbmV5JiM0Mzs9ZG9jLml0ZW0ucXVhbnRpdHkqZG9jLml0ZW0ucHJpY2U7PC9wPgo8cD4gICAgICAgIH0sPC9wPgo8cD4gICAgZmluYWxpemUgOiBmdW5jdGlvbiBGaW5hbGl6ZShvdXQpIHs8L3A+CjxwPiAgICAgICAgIG91dC5hdmc9b3V0Lm1vbmV5L291dC50b3RhbDwvcD4KPHA+ICAgICAgICAgcmV0dXJub3V0OzwvcD4KPHA+ICAgIH08L3A+CjxwPiAgfSk7PC9wPgogveG5+6O6CjxwPiAgICA8aW1nIHNyYz0="http://www.cppentry.com/upload_files/article/57/1_m4i5x__.png" alt="\">

3)keyf的使用

keyf 对日期进行处理并以作为key来进来分组

db.orders.group({

keyf: function (doc){

return{"month':doc.date.getMonth()+1};

},

initial :{"total":0,"money":0},

reduce : function Reduce(doc, out) {

out.total+=doc.item.quantity;

out.money+=doc.item.quantity*doc.item.price;

},

finalize : function Finalize(out) {

out.avg=out.money/out.total

returnout;

}

});

结果:

\

三.Java MongoDB 实馅??http://www.2ct

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇ACCESS数据库保留字千万慎用 下一篇DBlink的迁移(dblink中的密码未..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: