使用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
随机推荐
- AutoCAD菜单加载失败 找不到文件mnc 怎么办
菜单加载失败,找不到文件 SWFILECONV(mnu/mns/mnc) 找到CAD安装目录下的swfileconv.arx文件,用记事本打开,清空内容,然后保存即可.
- 水晶报表 Crystal Report 调用存储过程时出错 找不到表 ,解决方法。
用 CrystalReportViewer1 控件在asp.net的网页上显示报表,假设做报表时调用数据表数据的方式调用是能够成功的.但报表是用存储过程获取数据方式会出现下面错误: 找不到表'RptO ...
- BZOJ 3041 水叮当的舞步
3041: 水叮当的舞步 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 120 Solved: 67[Submit][Status][Discuss ...
- 记一次ORA-600[13011]
SunOS 5.10 Oracle 10.2.0.2.0 开发环境某一数据库出现ora-600报错. alert.log中的报错信息: Thu Nov 13 15:11:43 2014 Errors ...
- go17---并发
yjf512 · 2015-02-21 11:09:07 · 1076 次点击 · 预计阅读时间 2 分钟 · 大约1分钟之前 开始浏览 这是一个创建于 2015-02-21 11:09:07 ...
- 在MAC端查看win7
在MAC端查看win7,在finder中打开网络,输入win7地址,填入用户名和密码,就可以了
- bzoj 1497(最大权闭合子图)
1497: [NOI2006]最大获利 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 6410 Solved: 3099[Submit][Status] ...
- python re正则表达式模块
模块的的作用主要是用于字符串和文本处理,查找,搜索,替换等 复习一下基本的正则表达式吧 .:匹配除了换行符以为的任意单个字符 *:匹配任意字符,一个,零个,多个都能匹配得到 俗称贪婪模式 +:匹配 ...
- bzoj4264
哈希 cf原题...没见过的话真想不出来 将邻接表排序哈希,判断是否相同,但是会漏掉两点相邻的情况,于是再把自己加入自己的邻接表,然后再哈希判断. #include<bits/stdc++.h& ...
- bzoj 1734: [Usaco2005 feb]Aggressive cows 愤怒的牛【二分+贪心】
二分答案,贪心判定 #include<iostream> #include<cstdio> #include<algorithm> using namespace ...