使用morphia实现对mongodb的聚合查询
morphia是谷歌的一个针对mongodb的数据化持久框架;
关于mongodb的介绍不在这里展示,直接进入主题:采用morphia实现对mongodb的聚合查询
这里获取所有学生的分数总和
spring配置文件
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="
- http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"
- default-autowire="byName">
- <bean id="mongoDBManager" class="com.snake.bsys.common.db.MongoDBManager" scope="singleton" >
- <property name="serverIpAddr">
- <value>127.0.0.1</value>
- </property>
- <property name="serverPort">
- <value>27017</value>
- </property>
- <property name="userName">
- <value>用户名</value>
- </property>
- <property name="userPsw">
- <value>密码</value>
- </property>
- <property name="connSource">
- <value>库名</value>
- </property>
- </bean>
- <bean id="simpleMongoDBDao" class="com.snake.bsys.common.db.SimpleMongoDBDao" scope="singleton" >
- <property name="dbName">
- <value>库名</value>
- </property>
- </bean>
- </beans>
- public class SimpleMongoDBDao<T> {
- String dbName;
- public String getDbName() {
- return dbName;
- }
- public void setDbName(String dbName) {
- this.dbName = dbName;
- }
- public Datastore getDB() {
- Datastore datastore = MongoDBManager.getDB(dbName);
- return datastore;
- }
- public Pagination queryForPage(Pagination pagination, Query query) {
- try {
- //每页显示条数
- int pageSize = pagination.getPageSize();
- //第几页
- int pageCount = pagination.getPageNo();
- //总记录数
- int recordCount = pagination.getTotalCount();
- //获取总记录数
- recordCount = (int) query.count();
- //总记录数
- pagination.setTotalCount(recordCount);
- //第一条数据位置
- int firstResult = pagination.getFirstResult();
- firstResult = firstResult < 0 ? 0 : firstResult;
- FindOptions findOptions = new FindOptions();
- //起始位置
- findOptions.skip(firstResult);
- //查询条数
- findOptions.limit(pageSize);
- //当前页码
- pagination.setPageNo(pagination.getPageNo());
- //总页数
- pagination.setPageSize(PageHelper.getPageCount(recordCount, pagination.getPageSize()));
- List<T> list = query.asList(findOptions);
- pagination.setList(list);
- return pagination;
- } catch (Exception e) {
- e.printStackTrace();
- Log.logger.error(e.getMessage(), e);
- }
- return null;
- }
- public T getOne(Class classT, String colName, Object equalObj) {
- try {
- Datastore datastore = this.getDB();
- Query<T> query = datastore.createQuery(classT);
- query = query.field(colName).equal(equalObj);
- List<T> list = query.asList();
- if (list != null && list.size() > 0)
- return list.get(0);
- } catch (Exception ex) {
- ex.printStackTrace();
- Log.logger.error(ex.getMessage(), ex);
- }
- return null;
- }
- }
- public class MongoDBManager {
- String serverIpAddr="";
- int serverPort=0;
- String userName="";
- String userPsw="";
- String connSource="";
- public String getServerIpAddr() {
- return serverIpAddr;
- }
- public void setServerIpAddr(String serverIpAddr) {
- this.serverIpAddr = serverIpAddr;
- }
- public int getServerPort() {
- return serverPort;
- }
- public void setServerPort(int serverPort) {
- this.serverPort = serverPort;
- }
- public String getUserName() {
- return userName;
- }
- public void setUserName(String userName) {
- this.userName = userName;
- }
- public String getUserPsw() {
- return userPsw;
- }
- public void setUserPsw(String userPsw) {
- this.userPsw = userPsw;
- }
- public String getConnSource() {
- return connSource;
- }
- public void setConnSource(String connSource) {
- this.connSource = connSource;
- }
- MongoClient mongoClient;
- Morphia morphia;
- private static MongoDBManager runInstance;
- /**
- * 初始化连接池
- */
- public void initConn() {
- // 其他参数根据实际情况进行添加
- try {
- morphia = new Morphia();
- // 告诉Morphia在哪里找到你的类
- // 可以为不同的包或者类进行多次的调用
- morphia.mapPackage("");
- ServerAddress serverAddress = new ServerAddress(serverIpAddr,serverPort);
- List<ServerAddress> addrs = new ArrayList<ServerAddress>();
- addrs.add(serverAddress);
- //MongoCredential.createScramSha1Credential()三个参数分别为 用户名 数据库名称 密码
- MongoCredential credential = MongoCredential.createScramSha1Credential(userName, connSource, userPsw.toCharArray());
- List<MongoCredential> credentials = new ArrayList<MongoCredential>();
- credentials.add(credential);
- mongoClient = new MongoClient(addrs,credentials);
- runInstance=this;
- Log.logger.info("mongoDB 初始化完成 init OK....at:"+ DateUtil.getStandardDate(new Date()));
- } catch (Exception e) {
- e.printStackTrace();
- Log.logger.error("mongoDB 失败,"+e.getMessage(),e);
- }
- }
- public static Datastore getDB(String dbName){
- Datastore datastore=null;
- if(runInstance.mongoClient!=null&&runInstance.morphia!=null){
- datastore = runInstance.morphia.createDatastore(runInstance.mongoClient, dbName);
- datastore.ensureIndexes();
- }else{
- Log.logger.warn("mongoDB 未初始化!");
- }
- return datastore;
- }
- }
- 实体类:
- package com.luo.model;
- import org.mongodb.morphia.annotations.Entity;
- import org.mongodb.morphia.annotations.Id;
- @Entity(value = "user_score", noClassnameStored = true)
- public class UserDoc {
- @Id
- private Object mgId;
- private String name;
- private Integer score;
- public Object getMgId() {
- return mgId;
- }
- public void setMgId(Object mgId) {
- this.mgId = mgId;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public Integer getScore() {
- return score;
- }
- public void setScore(Integer score) {
- this.score = score;
- }
- }
- //需要封装结果集:
- package com.luo.model;
- import org.mongodb.morphia.annotations.Entity;
- import org.mongodb.morphia.annotations.Id;
- @Entity
- public class ScoreGroupDOC {
- @Id
- private Object mgId;
- private Integer totalScore;
- public Object getMgId() {
- return mgId;
- }
- public void setMgId(Object mgId) {
- this.mgId = mgId;
- }
- public Integer getTotalScore() {
- return totalScore;
- }
- public void setTotalScore(Integer totalScore) {
- this.totalScore = totalScore;
- }
- }
- package com.luo.model;
- import org.mongodb.morphia.Datastore;
- import org.mongodb.morphia.aggregation.AggregationPipeline;
- import org.mongodb.morphia.query.Query;
- import org.springframework.stereotype.Service;
- import javax.annotation.Resource;
- import java.util.Iterator;
- import static org.mongodb.morphia.aggregation.Group.grouping;
- import static org.mongodb.morphia.aggregation.Group.id;
- import static org.mongodb.morphia.aggregation.Group.sum;
- @Service
- public class UserService {
- @Resource
- SimpleMongoDBDao<UserDoc> simpleMongoDBDao;
- public ScoreGroupDOC getTotalScore(){
- Datastore datastore = simpleMongoDBDao.getDB();
- Query<UserDoc> query = datastore.createQuery(UserDoc.class);//查询对象
- /*获取分数合计*/
- AggregationPipeline pipeline = datastore.createAggregation(UserDoc.class)
- //封装到结果集的字段 获取聚合的字段
- .match(query).group(id(grouping("mgId")),grouping("totalScore", sum("score")));
- Iterator<ScoreGroupDOC> iterator = pipeline.aggregate(ScoreGroupDOC.class);
- ScoreGroupDOC groupDOC = new ScoreGroupDOC();
- while (iterator.hasNext()) {
- groupDOC = iterator.next();
- }
- return groupDOC;
- }
- }
一个刚入行不久的新手程序员也是刚刚接触mongoDB不到一周的时间,第一次写。做个记录,morphia这个框架在网上的资料实在太少了。当时为了求账单的金额合计查了一整天的资料。东拼西凑最终还是把结果做出来了。不过说实在的速度虽然比mySql要好一些。50多万条数据在我自己的笔记本上还是需要2秒多的时间。希望有高手指点一下 提升一下我的聚合查询速度;
不甚感激;
使用morphia实现对mongodb的聚合查询的更多相关文章
- mongodb 高级聚合查询
mongodb高级聚合查询 在工作中会经常遇到一些mongodb的聚合操作,特此总结下.mongo存储的可以是复杂类型,比如数组.对象等mysql不善于处理的文档型结构,并且聚合的操作也比mysq ...
- mongodb高级聚合查询
在工作中会经常遇到一些mongodb的聚合操作,特此总结下.mongo存储的可以是复杂类型,比如数组.对象等mysql不善于处理的文档型结构,并且聚合的操作也比mysql复杂很多. 注:本文基于 mo ...
- mongodb高级聚合查询(转)
在工作中会经常遇到一些mongodb的聚合操作,特此总结下.mongo存储的可以是复杂类型,比如数组.对象等mysql不善于处理的文档型结构,并且聚合的操作也比mysql复杂很多. 注:本文基于 mo ...
- MongoDB的使用学习之(七)MongoDB的聚合查询(两种方式)附项目源码
先来张在路上…… 铛铛铛……项目源码下载地址:http://files.cnblogs.com/ontheroad_lee/MongoDBDemo.rar 此项目是用Maven创建的,没有使用Mave ...
- 【Mongodb】聚合查询 && 固定集合
概述 数据存储是为了可查询,统计.若数据只需存储,不需要查询,这种数据也没有多大价值 本篇介绍Mongodb 聚合查询(Aggregation) 固定集合(Capped Collections) 准备 ...
- C#实现对mongoDB的简单增删查改
首先添加所需要驱动包(可通过nuget获得) using MongoDB.Bson;using MongoDB.Driver;using MongoDB.Driver.Builders; 一.设置配置 ...
- PHP实现对MongoDB的基础操作
PHP扩展 PHP5.2.PH ...
- java中实现对list的模糊查询
比如我有下面这样一个List,里面存放的是多个Employee对象.然后我想对这个List进行按照Employee对象的名字进行模糊查询.有什么好的解决方案么?比如我输入的查询条件为“wang”,那么 ...
- Javaweb实现对mongodb的增删改查(附带源代码)
运行截图: 删除后的信息 项目源代码:https://www.cnblogs.com/post/readauth?url=/zyt-bg/p/9807396.html
随机推荐
- day03-hdfs的客户端操作\hdfs的java客户端编程
5.hdfs的客户端操作 客户端的理解 hdfs的客户端有多种形式: 1.网页形式 2.命令行形式 3.客户端在哪里运行,没有约束,只要运行客户端的机器能够跟hdfs集群联网 文件的切块大小和存储的副 ...
- [AngularJS] ocLazyLoad -- Lazy loaded module should contain all the dependencies code
Recentlly works with AngularJS + ocLazyLoad, our project have break down into multi small modules. F ...
- 第6章1节《MonkeyRunner源代码剖析》Monkey原理分析-事件源-事件源概览
在上一章中我们有简要的介绍了事件源是怎么一回事.可是并没有进行详细的描写叙述.那么往下的这几个小节我们就须要把这方面的知识给补充完整. 这一节我们先主要环绕MonkeySourceNetwork这个事 ...
- matlab Newton method
% Matlab script to illustrate Newton's method % to solve a nonlinear equation % this particular scri ...
- 从Linux内核升级的必要性说开去
Linux内核更新超级频繁,可是有必要时刻升级吗?个人感觉没有必要,可是你要时刻关注新特性列表,然后把自己的内核升级到离最新版本号差一两个月公布的版本号而不是最新版本号.以保证稳定性,由于一两个月的时 ...
- Android 跑马灯效果与EditText冲突
近期一个项目,因为布局TextView内容太长了.首先想到的就是跑马灯效果,所以就把TextView又一次自己定义了,尽管跑马灯效果实现了.只是导致了还有一个问题就是EditText输入问题,当第一次 ...
- centos内核编译配置
1.下载内核,下面是内核官网地址:https://www.kernel.org/ tar.xz 是完整的内核包(完整的内核包是通过两次压缩得到的.一次是xz,一次是tar) pgp 是 ...
- 关于Dubbo中一些小众但很实用的功能
dubbo功能非常完善,很多时候我们不需要重复造轮子,下面列举一些你不一定知道,但是很好用的功能: 直连Provider 在开发及测试环境下,可能需要绕过注册中心,只测试指定服务提供者,这时候可能需要 ...
- linux下的C语言开发(定时器)
定时器是我们需要经常处理的一种资源.那Linux下面的定时器又是怎么一回事呢?其实,在linux里面有一种进程中信息传递的方法,那就是信号.这里的定时器就相当于系统每隔一段时间给进程发一个定时信号,我 ...
- [Shell学习笔记] read命令从键盘或文件中获取标准输入(转载)
转自:http://www.1987.name/151.html read命令是用于从终端或者文件中读取输入的内部命令,read命令读取整行输入,每行末尾的换行符不被读入.在read命令后面,如果没有 ...