文档章节

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

beanGou
 beanGou
发布于 2017/09/03 18:14
字数 692
阅读 95
收藏 1
点赞 0
评论 0

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
码字总数 19938
作品 0
杭州
程序员
waylau/mongodb-file-server

MongoDB File Server(基于 MongoDB 的文件服务器) MongoDB File Server is a file server system based on MongoDB. MongoDB File Server is committed to the storage of small files, su......

waylau ⋅ 04/26 ⋅ 0

Spring从MongoDB中下载文件之GridFS

问题 之前提到过以GridFS方式上传问题到MongoDB中:Spring保存文件到MongoDB之GridFS支持。现在需要从Mongodb中读取文件,应该怎么处理类? 解决 Maven 注解mongoDbFactory 获取文件流 Note...

亚林瓜子 ⋅ 06/12 ⋅ 0

MongoDB在spring中xml传统配置

背景 旧项目中依然在使用springmvc的xml传统配置,最近需要使用MongoDB,需要在spring引入MongoDB的连接配置。 解决 配置mongodb数据库 配置mongodb数据工厂 配置mongodb的Template 配置mon...

亚林瓜子 ⋅ 06/12 ⋅ 0

Spring boot中mongodb的使用

mongodb的增删改查 Spring Boot对各种流行的数据源都进行了封装,当然也包括了mongodb,下面给大家介绍如何在spring boot中使用mongodb: 1、pom包配置 pom包里面添加spring-boot-starter-dat...

glen_xu ⋅ 06/11 ⋅ 0

spring-boot-starter-mongodb-pool

在日常工作中,我们通过Spring Data Mongodb来操作Mongodb数据库,在Spring Boot中只需要引入spring-boot-starter-data-mongodb即可。 很多时候我们往往需要操作多个数据库(微服务架构下一个...

尹吉欢 ⋅ 04/22 ⋅ 0

waylau/new-star-blog

NewStarBlog NewStarBlog is an open source Java blog platform. NewStarBlog 是开源 Java 博客平台。 Technologies 涉及技术 NewStarBlog covers Spring Framework 5, Spring Boot 2, Thym......

waylau ⋅ 04/26 ⋅ 0

一文读懂 Spring Boot、微服务架构和大数据治理三者之间的故事

微服务的诞生并非偶然,它是在互联网高速发展,技术日新月异的变化以及传统架构无法适应快速变化等多重因素的推动下诞生的产物。互联网时代的产品通常有两类特点:需求变化快和用户群体庞大,...

java高级架构牛人 ⋅ 05/14 ⋅ 0

一文读懂 Spring Boot、微服务架构和大数据治理三者之间的故事

微服务架构 微服务的诞生并非偶然,它是在互联网高速发展,技术日新月异的变化以及传统架构无法适应快速变化等多重因素的推动下诞生的产物。互联网时代的产品通常有两类特点:需求变化快和用...

ityouknow ⋅ 05/16 ⋅ 0

一文读懂Spring Boot、微服务架构和大数据治理之间的故事

微服务架构 微服务的诞生并非偶然,它是在互联网高速发展,技术日新月异的变化以及传统架构无法适应快速变化等多重因素的推动下诞生的产物。互联网时代的产品通常有两类特点:需求变化快和用...

纯洁微笑 ⋅ 05/10 ⋅ 0

NewStarBlog 发布 1.0 版本,国产开源 Java 博客平台

NewStarBlog 是开源 Java 博客平台。 涉及技术 NewStarBlog 使用了 Spring Framework 5, Spring Boot 2, Thymeleaf, Elasticsearch, Spring Data 等技术。 JDK 8 Gradle 4.5.1 Spring Boot 2......

waylau ⋅ 04/26 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

十五周二次课

十五周二次课 17.1mysql主从介绍 17.2准备工作 17.3配置主 17.4配置从 17.5测试主从同步 17.1mysql主从介绍 MySQL主从介绍 MySQL主从又叫做Replication、AB复制。简单讲就是A和B两台机器做主...

河图再现 ⋅ 47分钟前 ⋅ 0

docker安装snmp rrdtool环境

以Ubuntu16:04作为基础版本 docker pull ubuntu:16.04 启动一个容器 docker run -d -i -t --name flow_mete ubuntu:16.04 bash 进入容器 docker exec -it flow_mete bash cd ~ 安装基本软件 ......

messud4312 ⋅ 今天 ⋅ 0

OSChina 周一乱弹 —— 快别开心了,你还没有女友呢。

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子 :分享吴彤的单曲《好春光》 《好春光》- 吴彤 手机党少年们想听歌,请使劲儿戳(这里) @clouddyy :小萝莉街上乱跑,误把我认错成...

小小编辑 ⋅ 今天 ⋅ 7

mysql in action / alter table

change character set ALTER SCHEMA `employees` DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_general_ci ;ALTER TABLE `employees`.`t2` CHARACTER SET = utf8mb4 , COLLAT......

qwfys ⋅ 今天 ⋅ 0

Java 开发者不容错过的 12 种高效工具

Java 开发者常常都会想办法如何更快地编写 Java 代码,让编程变得更加轻松。目前,市面上涌现出越来越多的高效编程工具。所以,以下总结了一系列工具列表,其中包含了大多数开发人员已经使用...

jason_kiss ⋅ 昨天 ⋅ 0

Linux下php访问远程ms sqlserver

1、安装freetds(略,安装在/opt/local/freetds 下) 2、cd /path/to/php-5.6.36/ 进入PHP源码目录 3、cd ext/mssql进入MSSQL模块源码目录 4、/opt/php/bin/phpize生成编译配置文件 5、 . ./...

wangxuwei ⋅ 昨天 ⋅ 0

如何成为技术专家

文章来源于 -- 时间的朋友 拥有良好的心态。首先要有空杯心态,用欣赏的眼光发现并学习别人的长处,包括但不限于工具的使用,工作方法,解决问题以及规划未来的能力等。向别人学习的同时要注...

长安一梦 ⋅ 昨天 ⋅ 0

Linux vmstat命令实战详解

vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。这个命令是我查看Linux/Unix最喜爱的命令...

刘祖鹏 ⋅ 昨天 ⋅ 0

MySQL

查看表相关命令 - 查看表结构    desc 表名- 查看生成表的SQL    show create table 表名- 查看索引    show index from  表名 使用索引和不使用索引 由于索引是专门用于加...

stars永恒 ⋅ 昨天 ⋅ 0

easyui学习笔记

EasyUI常用控件禁用方法 combobox $("#id").combobox({ disabled: true }); ----- $("#id").combobox({ disabled: false}); validatebox $("#id").attr("readonly", true); ----- $("#id").r......

miaojiangmin ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部