mongo的分组求和目录
- 1、mongo脚本语句的分组求和
- 2、java中的spring-data-mongodb分组求和
1、mongo脚本语句的分组求和
mongo文档集合结构:
脚本如下:
db.getCollection("StatisticalEmployees").aggregate([{
$match: {
'org_id': "a024db93c3b311e9a9bc98039b473960",
'status': 0,
'date': {
$gte: ISODate("2019-07-01 00:00:00"),
$lt: ISODate("2019-08-01 00:00:00")
}
}
}, {
$group: {
"_id": {
"org_id": "$_id.org_id",
"date": "$_id.date"
},
"total": {
"$sum": "$fans_number"
}
}
}, {
$project: {
"_id": 0,
"total": 1
}
}])
解读:
(1)match:查询的筛选条件
(2)group:
1)_id:分组的字段
2)total:所要取的聚合函数
[1] $sum:表示求和的聚合函数
(3)project:查询后的显示字段,0:表示不显示;1:表示显示
2、java中的spring-data-mongodb分组求和
注意点:
(1)0要使用该管道方法,spring-data-mongodb 必须 是 1.10.10 版本以上
(2)mongo数据库存储的是文档,就像java的.class文件;故而建议字段多单词时,使用驼峰命名
(3)在此方法中,需特别注意的是字段映射问题,建议 java对象和mongo数据库 均 使用驼峰命名法(以避免映射问题)
结果如下:
解读:
(1)Aggregation.match(Criteria语句):存放的是条件,类似于MySQL中的where语句
(2)Aggregation.group(String… key):参数表示 可变多参数 ,指的是分组参数或分组多参数
(3)Aggregation.group(String… key).sum(字段名).as(别名):如同MySQL中的聚合函数与别名,需要 一起使用
(4)Aggregation.group(String… key):与MySQL相同, 如果不是分组参数,在查询的字段中就一定要是聚合函数;否则报错 。亦可 将其余要的字段当做分组参数 (即多分组参数)
(5)Aggregation.project(String… 别名):可变多参数,将 group方法里的聚合函数别名 放于此,表明查询出所要的聚合函数
注意: 在mongo中,分组求和时,会将 分组参数的值赋给mongo数据库自动生成的_id字段 ,表示 唯一值
(1)如果直接使用Aggregation.project(String key, String… 别名)的形式,实际上的 key值会在_id字段 ,而 key字段为null
(2)Aggregation.project(String… 别名).and(String 别名).previousOperation():表示 将_id字段的值赋给前面and()中的别名
(3)一旦 分组参数有多个 ,_id 将会采用 json的格式 , 包含多个 参数字段;故而使用第二点时,and()中的 别名也将会是json格式 (多个参数字段);如: and()中的别名 = _id = {key1: “key1”, key2: “key2”}
(4)Aggregation.project(String… 别名).andInclude(String key1).andInclude(String key2):表示查询出所要的分组参数(其中的 key1、key2应当是group() 中的分组字段);实际上就是 相当于 key1 = _id.key1 = “key1”;key2 = _id.key2 = "key2"