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. Linux学习系列之lvs+keepalived

    LVS简介 LVS介绍 LVS是Linux Virtual Server的缩写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统,属于4层负载均衡 ipvs和ipvsadm的关系 我们使用配置LV ...

  2. CLLocation的属性以及使用的解释

    http://blog.csdn.net/u012496940/article/details/47405345  上一篇的链接(一个定位实例) 从上一篇中的实例了解所使用的一些元素: CLLcati ...

  3. 我怎么在AD里面找到已经改名的Administrator账户?

    近期有博友问我一个问题,他是一个企业里面的IT管理员,他非常苦恼.他是一个新手,之前管理员交接的时候,没有交接更改的管理员username和password.他如今不知道哪个才是系统之前内置的admi ...

  4. ubuntu12.04通过Ganglia利用NVML模块进行GPU监控

    1.安装Ganglia,这里安装的是3.1*版本,因为监控GPU的模块只支持3.1*版本系列的 apt-get install ganglia* 2.下载并安装PyNVML和NVML模块,下载地址ht ...

  5. 阳性比例 mysql CASE UNION ALL

    阳性比例 mysql CASE UNION ALL SELECT t.*,t.type_0/all_ FROM ( SELECT FROM_UNIXTIME(create_time,'%Y-%m-%d ...

  6. 利用JFreeChart生成时序图(6) (转自 JSP开发技术大全)

    利用JFreeChart生成时序图(6) (转自 JSP开发技术大全) 14.6 利用JFreeChart生成时序图 通过JFreeChart插件只能生成普通效果的时序图,利用工厂类ChartFact ...

  7. Bing必应地图中国API-放大与平移

    Bing必应地图中国API-放大与平移 2011-05-24 14:26:32|  分类: Bing&Google|字号 订阅     有些时候我们不希望通过默认的控制栏来控制地图,而是希望能 ...

  8. codeforces 245H Queries for Number of Palindromes RK Hash + dp

    H. Queries for Number of Palindromes time limit per test 5 seconds memory limit per test 256 megabyt ...

  9. 准确率,精确率,召回率,F-measure 之间的关系

    总结:(图上 R的计算的分母应该是 :40+10 )(笔误) 模型条件放宽,负类被误判为正类的可能性就变大(即FP变大)精确率和准确率会受影响(变小) 模型条件变严格,正类有可能被误判为负类(即FN变 ...

  10. mysql/sql server和java之间的数据类型对应关系

    Mysql************************************当前列 ClassName ColumnType DisplaySize TypeName0: java.lang.I ...