使用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
随机推荐
- 卸载MySQL 5.0
昨天在Navicat for mysql中导入一个脚本,执行.出现乱码. 考虑到可能是版本号问题,就想卸载了又一次安装MYSQL,这一卸载倒是出了问题.导致安装的时候安装不上. 后来无意发现是卸载的时 ...
- 【BLE】CC2541之自己定义长短按键
本篇博文最后改动时间:2017年01月06日,11:06. 一.简单介绍 本文以SimpleBLEPeripheral为例,介绍怎样将普通IO口(P12)自己定义为长短按键,实现按键3S以内松开为短按 ...
- HDU 3280 Equal Sum Partitions(二分查找)
Equal Sum Partitions Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- Android基础新手教程——4.3.1 BroadcastReceiver牛刀小试
Android基础新手教程--4.3.1 BroadcastReceiver牛刀小试 标签(空格分隔): Android基础新手教程 本节引言 本节我们将来学习Android四大组件中的第三个:Bro ...
- 我是怎样自学 Android 的?
1. Java知识储备 本知识点不做重点解说: 对于有基础的同学推荐看<Java编程思想>,巩固基础,查漏补全,了解并熟悉很多其它细节知识点. 对于没有基础的同学推荐看一本Java基础的书 ...
- hdu 4864 Task(贪心)
pid=4864">http://acm.hdu.edu.cn/showproblem.php?pid=4864 大致题意:有n台机器和m个任务,都有两个參数工作时间time和难度le ...
- Python按行输出文件内容具体解释及延伸
下面两端測试代码分别为笔者所写,第一段为错误版本号.后者为正确版本号: #! /usr/bin/python2.7 try: filename = raw_input('please inpu ...
- 【bzoj4590】[Shoi2015]自动刷题机
因为解一定是单调的,n越小切的题越多,这是可以肯定的,那么直接二分答案 #include<algorithm> #include<iostream> #include<c ...
- win7 32位解决matlab out of memory问题
由于最近在做DL,matlab load数据时由于内存只有2G,会出现out of memory的情况,网上百度了下都是在xp下打开3GB来解决该问题,但是由于win7没有boot.ini无法在win ...
- 【175】Easy CHM的使用
首先下载软件,EasyCHM3.84完美破解版.rar! 安装好之后,打开程序,点击“新建”,然后浏览到存放 htm 文件的目录. 鼠标右键,选择“添加目录项”!如下图所示. 在弹出的文本框中,首先选 ...