文档章节

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

beanGou
 beanGou
发布于 2017/09/03 18:14
字数 692
阅读 237
收藏 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
博文 88
码字总数 19938
作品 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
通过spring-data-mongodb 操作mongodb

一、前言 其实,以前项目组也使用过mongodb,只是那时候是作为主数据库来使用,所以在框架方面会更加复杂,比如使用jpa,如果只是把mongodb作为附数据库使用的话,个人认为通过spring-data-m...

漂泊者及其影子
2014/11/19
0
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
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JS:异步 - 面试惨案

为什么会写这篇文章,很明显不符合我的性格的东西,原因是前段时间参与了一个面试,对于很多程序员来说,面试时候多么的鸦雀无声,事后心里就有多么的千军万马。去掉最开始毕业干了一年的Jav...

xmqywx
今天
0
0
Win10 64位系统,PHP 扩展 curl插件

执行:1. 拷贝php安装目录下,libeay32.dll、ssleay32.dll 、 libssh2.dll 到 C:\windows\system32 目录。2. 拷贝php/ext目录下, php_curl.dll 到 C:\windows\system32 目录; 3. p...

放飞E梦想O
今天
0
0
谈谈神秘的ES6——(五)解构赋值【对象篇】

上一节课我们了解了有关数组的解构赋值相关内容,这节课,我们接着,来讲讲对象的解构赋值。 解构不仅可以用于数组,还可以用于对象。 let { foo, bar } = { foo: "aaa", bar: "bbb" };fo...

JandenMa
今天
1
0
OSChina 周一乱弹 —— 有人要给本汪介绍妹子啦

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子 :分享水木年华的单曲《中学时代》@小小编辑 手机党少年们想听歌,请使劲儿戳(这里) @须臾时光:夏天还在做最后的挣扎,但是晚上...

小小编辑
今天
21
5
centos7安装redis及开机启动

配置编译环境: sudo yum install gcc-c++ 下载源码: wget http://download.redis.io/releases/redis-3.2.8.tar.gz 解压源码: tar -zxvf redis-3.2.8.tar.gz 进入到解压目录: cd redis-3......

hotsmile
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部