添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
$project:映射,查询的字段,1显示,0不显示
$match:过滤,查询条件(相当于sql中的where)
$group:分组,这里用到了 mongo 自带的 $month函数,可以根据createTime中的月分组
分页、排序等语句可以在后面累加;
映射,过滤,分组,分页,排序等有顺序,顺序可以改变,下层在上层的基础上处理数据(管道);
三.java mongoTemplate实现
public AggregationResults<ContactMember> findContactMemberGroupMonth(Date date,Integer userId){
        //查询条件
        Criteria criteria=new Criteria();
        //封装查询日期,gte大于等于
        criteria.and("createTime").gte(date);
        //分组对象
        Aggregation aggregation=Aggregation.newAggregation(
                //添加过滤条件
                Aggregation.match(criteria),
                //查询字段,andExpression(xx).as(yy) 表示将查询字段中的yy替换为xx
                //这里用到了 month函数,需要替换
                Aggregation.project("createTime","userId").andExpression("{$month: '$createTime'}").as("createTime"),
                //根据createTime分组
                //first为 当前列聚合时取多条数据中的第一条
                Aggregation.group("createTime").first("createTime").as("monthNum").count().as("monthCount").first("userId").as("userId")
        //本项目根据userId进行了分表,所以对mongoTemplate进行了封装
        //底层调用 mongoTemplate.aggregate(aggregate, colName, ContactMember.class);
        return super.aggregateResult(aggregation,userId);
 @Test
    public void testFindContactMemberGroupMonth(){
        Calendar instance = Calendar.getInstance();
        //过去一年
        instance.add(Calendar.YEAR,-1);
        AggregationResults<ContactMember> groupMonth = contactMemberService.findContactMemberGroupMonth(instance.getTime(),15);
        System.out.println("test123:"+groupMonth.getMappedResults().size());
        System.out.println("test124:"+groupMonth.getMappedResults().get(0));
测试通过(用户id为15的用户10月增加的联系人有5个,和数据库查询结果一致),打印结果:
test123:2
test124:ContactMember{id='10', listId=null, userId=15, email='null', phone='null', name='null', createTime=null, updateTime=null, properties=null, grade='null', importBatchNo='null', tags=null, monthCount=5, monthNum=10}

关于分组和聚合

分组指的是将满足相同条件的数据变为一条(组)数据
比如createTime 创建时间为 2020年的11月有10条数据,若根据createTime 为2020年11月分组,分组后createTime字段唯一,其他字段不一定唯一,其他字段怎么显示呢?这里要用到聚合函数
聚合指的是多个数据如何取值
常见的聚合函数有:sum(求和),max(取最大值),min(最小值),avg(平均值),first(第一个),last(最后一个),count(记录条数)等
本例聚合的所有userId都相同,所以使用first函数即可

mongoDB文档:https://docs.mongodb.com/v2.4/reference/operator/aggregation/project/

一.需求统计当前用户过去一年中每个月新增联系人(联系人表存储在mongoDB)二.分析:根据createTime 中的月分组,聚合返回字段有:用户id,分组月份,该月记录条数三:mongo 查询语句说明:$project:映射,查询的字段,1显示,0不显示$match:过滤,查询条件(相当于sql中的where)$group:分组,这里用到了 mongo 自带的 $month函数,可以根据createTime中的月分组注意分页、排序等语句可以在后面累加;映射,过滤,分组,分页,排序 db.mogOrderInfo.find({ "itemId":"9140040075", "orderTime":{"$gte":ISODate("2019-07-09T22:00:00.000Z"),"$lte":ISODate("2019-07-10T04:00:00.000Z")}, "showStatus":{$in:[1,2,5]}...
文章目录1 摘要2 按照固定字段分组查询3 分组分页查询4 按照日期分组查询(字段为精确到秒的时间戳)5 按照日期分组查询(字段为精确到毫秒的时间戳)6 按照日期分组查询(字段为Date)7 按照自定义时间区间分组查询8 数据库实体类及其他相关类8.1 数据库实体类8.2 统计结果类8.3 日期分组信息类8.4 获取日期分组信息的方法9 推荐参考资料10 本次提交记录 MongoDb 如何实现聚合查询?分组查询?分组分页查询?自定义时间区间查询?时间格式转换查询?不要慌,本文将介绍基于 S
简单+进阶简单准备:查询:删除:增加:修改:思路进阶:查询(指定字段过滤)修改(多层数组精确修改)讨论总结 注:本文只讲在java中的使用,并且只简单讲一下本人在开发中遇到的一部分 并不完全概括 在cmd中的请自行查看其他博主. 想用它就得引入它: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring
Spring+Mongodb在查询数据时,是可以指定查询集合的。那么现在的需求是按份查询数据。 一、在serviceImpl上,先指定构造时间集合字符串 @Resource private MongoTemplate mongoTemplate; private String monthCollection = String.format("%s_warningInfo", formatDat...
今天练习在java使用mongodb,进行分组,刚开始没有思路,后来通过查资料,大概写了一个demo,以下是分组java中用到的group分组代码: 这是mongodb中的数据: 这是java中的代码: String[] field = {"teacher_name","teacher_synopsis"}; //分组的依据,根据那些参数进行分组 Aggregation aggregat...
Due to limitations of the com.mongodb.BasicDocument, you can't add a second '$and' expression specified as '$and :   错误原因:在一个 Criteria 对象中调用了多次 andOperator() 方法 使用mongoTemplate实现...
Java mongotemplate聚合函数可以通过 Aggregation 类来实现。以下是一些常见的聚合函数: 1. `$match`:选择符合条件的文档。 ```java Aggregation.match(Criteria.where("name").is("John")) 2. `$group`:将文档按照某个字段分组,并对每个组进行聚合操作。 ```java Aggregation.group("name").sum("score").as("totalScore") 3. `$project`:选择需要输出的字段。 ```java Aggregation.project("name", "age") 4. `$sort`:按照某个字段排序。 ```java Aggregation.sort(Sort.Direction.DESC, "score") 5. `$limit`:限制输出文档的数量。 ```java Aggregation.limit(10) 6. `$skip`:跳过指定数量的文档。 ```java Aggregation.skip(5) 以上只是一些常见的聚合函数,还有很多其他的聚合函数,可以根据具体需求来选择。
git下载,上传代码到GitLab ; Untracked files (use “git add <file>...“ to include in what will be committed) 34003