文档章节

spring-data-mongodb高级查询用法小结

beanGou
 beanGou
发布于 2017/09/03 18:14
字数 692
阅读 623
收藏 1

0.准备工作,先介绍下mongodb的集合名,java bean,以及数据结构

  • mongodb集合名称:doc_pageview

  • 集合数据结构:

    	{
    	"_id" : ObjectId("xxxx"),    
    	"shopId" : "xxx",
    	"domain" : "xxxx",
    	"url" : "xxxx",
    	"pageTitle" : "xxx",
    	"pageId" : "xxxx",
    	"cookie" : "xxx",
    	"ip" : "xxxx",
    	"viewDate" : NumberLong(xxxx),
    	"date" : "yyyy-MM-dd",
    	"stayTime" : NumberLong(xxxx)
    	}
    
  • java bean(为保证代码简洁,@Getter、@Setter的注解,使用到lombok):

    	 @Document(collection = "doc_pageview")
    	 @Getter
    	 @Setter
    	public class PageViewBean {
    	    @Id
    	    private String id; //主键
    	    private String domain; //域名
    	    private String url; //相对链接
    	    private String pageTitle; //页面标题
    	    private String pageId; //页面ID
    	    private String cookie;
    	    private Long viewDate; //访问时间(时间戳)
    	    private String shopId; //店铺ID
    	    private String ip; //访问IP
    	    private String date; // 日期:yyyy-MM-dd
    	    private Long stayTime; // 停留时间
    	}
    

1.相关包的引入(笔者使用版本是1.4.0.RELEASE,读者可以选择更高版本)

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
    <version>1.4.0.RELEASE</version>
</dependency>

2.分页、排序操作

分页排序操作使用org.springframework.data.domain.Pageable,如果根据条件查询,使用注解@Query(org.springframework.data.mongodb.repository.Query)即可。eg:查询cookie=111,date=2017-09-07的前100条记录,按照viewDate倒序(注意实现 MongoRepository接口)

public interface PageViewLogRepository extends MongoRepository<PageViewLogBean, String> {

    /**
     * 根据参数查询日志集合
     * @param cookie
     * @param date
     * @param pageable
     * @return
     */
    @Query("{'cookie':?0,'date':?1}")
    List<PageViewLogBean>  findByCookieAndDate(String cookie,String date, Pageable pageable);
}       

测试:

    Pageable pageable = new PageRequest(0, 100, new Sort(Sort.Direction.DESC, "viewDate"));
    Page<PageViewLogBean> page = pageViewLogRepository. findByCookieAndDate("111", "2017-09-07", pageable);

3. 聚合操作(分组、求和、平均值、分页、排序)

刚开始尝试使用上面的@Query来做,后来没有发现解决办法(个人认为@Query只是用来处理比较简答的查询,大家如果有,欢迎提出来);本着关系型数据库能做的,mongodb也能做的指导思想,于是尝试新的api;虽然花了点时间,最终还是找到了,核心是org.springframework.data.mongodb.core.aggregation里面的类。其中,Aggregation.newAggregation这个方法是Aggregation的静态方法,支持可变参数,源码如下:

	/**
	 * Creates a new {@link Aggregation} from the given {@link AggregationOperation}s.
	 *
	 * @param operations must not be {@literal null} or empty.
	 */
	public static Aggregation newAggregation(AggregationOperation... operations) {
		return new Aggregation(operations);
	}
	

AggregationOperation是一个接口,很多聚合操作只需实现该接口即可,以下是所有的实现类。 可以猜到SortOperation(排序)、LimitOperation和SkipOperation(分页);好了,现在回到具体问题上面,eg:查询从2017-08-07到2017-09-07一个月店铺的平均单个页面停留时间(总的停留时间/总的pv数),并按从大到小的顺序排序(貌似没啥具体意义,😁😁😁)

import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.aggregation.*;
import org.springframework.data.mongodb.core.query.Criteria;

// 根据avgPvTime=sumStayTime/countPv排序,如下
SortOperation sortOperation = sortOperation = Aggregation.sort(new Sort(Sort.Direction.DESC, "avgPvTime"));

// 根据shopId group查询
Aggregation aggregation = Aggregation.newAggregation(
                            Aggregation.match(Criteria.where("date").gte("2017-08-07").lte("2017-09-07")),
                            Aggregation.group("shopId").sum("stayTime").as("sumStayTime").count().as("countPv"),
                            new ProjectionOperation().andInclude("sumStayTime", "countPv").and("sumStayTime").divide("countPv").as("avgPvTime"),
                            sortOperation,
                            Aggregation.skip(0),
                            Aggregation.limit(100));

© 著作权归作者所有

共有 人打赏支持
beanGou
粉丝 7
博文 87
码字总数 19525
作品 0
杭州
程序员
私信 提问
MongoDB的使用学习之(七)MongoDB的聚合查询(两种方式)附项目源码

MongoDB的使用学习之(七)MongoDB的聚合查询(两种方式)附项目源码 先来张在路上…… 铛铛铛……项目源码下载地址:http://files.cnblogs.com/ontheroadlee/MongoDBDemo.rar 此项目是用Mav...

Airship
10/22
0
0
MongoDB系列三(Spring集成方案).

一、前言 MongoDB是最为流行的开源文档数据库之一。Spring Data MongoDB提供了三种方式在Spring应用中使用MongoDB: 通过注解实现对象-文档映射; 使用MongoTemplate实现基于模板的数据库访问...

jmcui
03/31
0
0
MongoDB高级查询[聚合]

因为最近测试MongoDB,也算是熟悉了MongoDB吧。MongoDB还算简单,在短短一周我就掌握了很多内容。相对于其他数据库这个确实容易多了。 我安装的: MongoDB版本为:2.0.8 系统为:64位Ubuntu ...

震秦
2012/12/24
0
1
使用Spring访问Mongodb的方法大全——Spring Data MongoDB查询指南

1.概述 Spring Data MongoDB 是Spring框架访问mongodb的神器,借助它可以非常方便的读写mongo库。本文介绍使用Spring Data MongoDB来访问mongodb数据库的几种方法: 使用Query和Criteria类 ...

xiaomin0322
06/28
0
0
SpringBoot | 第三十一章:MongoDB的集成和使用

前言 上一章节,简单讲解了如何集成。本章节,我们来看看如何集成的。是最早热门非关系数据库的之一,使用也比较普遍。最适合来存储一些非结构数据了,适合对大量或者无固定格式的数据进行存...

oKong
11/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

PHP生成CSV之内部换行

当我们使用PHP将采集到的文件内容保存到csv文件时,往往需要将采集内容进行二次过滤处理才能得到需要的内容。比如网页中的换行符,空格符等等。 对于空格等处理起来都比较简单,这里我们单独...

豆花饭烧土豆
今天
2
0
使用 mjml 生成 thymeleaf 邮件框架模板

发邮件算是系统开发的一个基本需求了,不过搞邮件模板实在是件恶心事,估计搞过的同仁都有体会。 得支持多种客户端 支持响应式 疼彻心扉的 outlook 多数客户端只支持 inline 形式的 css 布局...

郁也风
今天
8
0
让哲学照亮我们的人生——读《医务工作者需要学点哲学》有感2600字

让哲学照亮我们的人生——读《医务工作者需要学点哲学》有感2600字: 作者:孙冬梅;以前读韩国前总统朴槿惠的著作《绝望锻炼了我》时,里面有一句话令我印象深刻,她说“在我最困难的时期,...

原创小博客
今天
4
0
JAVA-四元数类

public class Quaternion { private final double x0, x1, x2, x3; // 四元数构造函数 public Quaternion(double x0, double x1, double x2, double x3) { this.x0 = ......

Pulsar-V
今天
18
0
Xshell利用Xftp传输文件,使用pure-ftpd搭建ftp服务

Xftp传输文件 如果已经通过Xshell登录到服务器,此时可以使用快捷键ctrl+alt+f 打开Xftp并展示Xshell当前的目录,之后直接拖拽传输文件即可。 pure-ftpd搭建ftp服务 pure-ftpd要比vsftp简单,...

野雪球
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部