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的聚合查询的更多相关文章

  1. mongodb 高级聚合查询

    mongodb高级聚合查询   在工作中会经常遇到一些mongodb的聚合操作,特此总结下.mongo存储的可以是复杂类型,比如数组.对象等mysql不善于处理的文档型结构,并且聚合的操作也比mysq ...

  2. mongodb高级聚合查询

    在工作中会经常遇到一些mongodb的聚合操作,特此总结下.mongo存储的可以是复杂类型,比如数组.对象等mysql不善于处理的文档型结构,并且聚合的操作也比mysql复杂很多. 注:本文基于 mo ...

  3. mongodb高级聚合查询(转)

    在工作中会经常遇到一些mongodb的聚合操作,特此总结下.mongo存储的可以是复杂类型,比如数组.对象等mysql不善于处理的文档型结构,并且聚合的操作也比mysql复杂很多. 注:本文基于 mo ...

  4. MongoDB的使用学习之(七)MongoDB的聚合查询(两种方式)附项目源码

    先来张在路上…… 铛铛铛……项目源码下载地址:http://files.cnblogs.com/ontheroad_lee/MongoDBDemo.rar 此项目是用Maven创建的,没有使用Mave ...

  5. 【Mongodb】聚合查询 && 固定集合

    概述 数据存储是为了可查询,统计.若数据只需存储,不需要查询,这种数据也没有多大价值 本篇介绍Mongodb 聚合查询(Aggregation) 固定集合(Capped Collections) 准备 ...

  6. C#实现对mongoDB的简单增删查改

    首先添加所需要驱动包(可通过nuget获得) using MongoDB.Bson;using MongoDB.Driver;using MongoDB.Driver.Builders; 一.设置配置 ...

  7. PHP实现对MongoDB的基础操作

    PHP扩展                                                                                      PHP5.2.PH ...

  8. java中实现对list的模糊查询

    比如我有下面这样一个List,里面存放的是多个Employee对象.然后我想对这个List进行按照Employee对象的名字进行模糊查询.有什么好的解决方案么?比如我输入的查询条件为“wang”,那么 ...

  9. Javaweb实现对mongodb的增删改查(附带源代码)

    运行截图: 删除后的信息 项目源代码:https://www.cnblogs.com/post/readauth?url=/zyt-bg/p/9807396.html

随机推荐

  1. 【转】使用Python中HTTPParser模块进行简单的html解析

    http://www.cnblogs.com/coser/archive/2012/01/09/2317076.html

  2. IE網址欄快速輸入網址,“Ctrl+Enter”補齊“.com”

    繁體中文Windows,預設 IE 在網址列輸入 abc,然後按 Ctrl+Enter ,會跳到www.abc.com.tw, 但較常用的連結是www.abc.com,如何修改这一設定呢? 可以透過修 ...

  3. Xcode中git的用法介绍与&quot;Please tell me who you are&quot;问题的解决方式

    我在之前多篇博客中解说了怎样使用命令行操作git,能够大大提高我们的工作效率.详细能够參考<Git学习札记><Git学习札记--进阶>等文章.事实上对于同一个工具,我们有不同的 ...

  4. Cracking the Coding Interview 150题(二)

    3.栈与队列 3.1 描述如何只用一个数组来实现三个栈. 3.2 请设计一个栈,除pop与push方法,还支持min方法,可返回栈元素中的最小值.pop.push和min三个方法的时间复杂度必须为O( ...

  5. 我和nupt集训队的故事

    纯水文,如有不适请ctrl+w撤离 亚洲赛刚结束.看了不少巨巨的退役贴以及岛娘在知乎上的那篇感天动地的人生经历.多少有点夜深忽梦少年事的错觉.作为一个两年前就打出gg的高龄选手,之后又强行以1次队员和 ...

  6. iOS学习笔记(4) — UITableView的 重用机制

    iOS学习笔记(4) — UITableView的 重用机制 UITableView中的cell是动态的,在使用过程中,系统会根据屏幕的高度(480)和每个cell的高度计算屏幕中需要显示的cell的 ...

  7. HDU1236 排名 题解

    Problem Description 今天的上机考试尽管有实时的Ranklist,但上面的排名仅仅是依据完毕的题数排序,没有考虑  每题的分值,所以并非最后的排名.给定录取分数线.请你敲代码找出最后 ...

  8. java poi excel导入模板设置下拉框

    import org.apache.poi.hssf.usermodel.DVConstraint; import org.apache.poi.hssf.usermodel.HSSFCell; im ...

  9. 2016/1/18 Java开发中的23种设计模式详解(转)

    设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...

  10. javascript总结02

    1 如何打开和关闭一个新的窗口? 2 Window对象的哪个属性能返回上一个浏览页面? 3 一次或多次执行一段程序的函数是什么? 定时函数 4 如何查找并访问节点? 5 给表格新增行和单元格的方法分别 ...