Spring MVC中使用Mongodb总结
来源:互联网 发布:英雄无敌3特长算法 编辑:程序博客网 时间:2024/06/02 17:55
近期项目做了次架构调整,原来是使用MySQL+GeoHash来存储LBS数据(地理位置信息),现在使用NOSQL数据库Mongodb来存储LBS数据(地理位置信息)。由于项目是基于Spring MVC开发的,今天就Mongodb的使用做下总结。
Spring MVC 集成Mongodb
1.加载jar,maven配置
<!-- 新加入的spring整合mongodb的包 开始 --> <dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-java-driver</artifactId> <version>2.13.0-rc0</version> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-mongodb</artifactId> <version>1.7.1.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-mongodb-cross-store</artifactId> <version>1.7.1.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-mongodb-log4j</artifactId> <version>1.7.1.RELEASE</version> </dependency> <!-- 新加入的spring整合mongodb的包 结束 -->
2.配置
Mongodb分2种方法集成,分别是单机和集群方式。
单机配置
applicationContext.xml
<mongo:mongo id="mongo" host="${mongo.host}" port="${mongo.port}" > <mongo:options connections-per-host="${mongo.connectionsPerHost}" threads-allowed-to-block-for-connection-multiplier="${mongo.threadsAllowedToBlockForConnectionMultiplier}" connect-timeout="${mongo.connectTimeout}" max-wait-time="${mongo.maxWaitTime}" auto-connect-retry="${mongo.autoConnectRetry}" socket-keep-alive="${mongo.socketKeepAlive}" socket-timeout="${mongo.socketTimeout}" slave-ok="${mongo.slaveOk}" write-number="1" write-timeout="0" write-fsync="true"/> </mongo:mongo>
配置文件common-config.properties
mongo.dbname = test_db #数据库名称mongo.password = test_pwd #密码mongo.username = test_user #用户名mongo.host = 127.0.0.1 #主机mongo.port= 27017 #端口号mongo.connectionsPerHost= 8 #一个线程变为可用的最大阻塞数mongo.threadsAllowedToBlockForConnectionMultiplier= 4 #线程队列数,它以上面connectionsPerHost值相乘的结果就是线程队列最大值mongo.connectTimeout= 1500 #连接超时时间(毫秒)mongo.maxWaitTime= 1500 #最大等待时间mongo.autoConnectRetry= true #自动重连mongo.socketKeepAlive= true #scoket保持活动mongo.socketTimeout=1500 #scoket超时时间mongo.slaveOk=true #读写分离
集群配置
applicationContext.xml
<mongo:mongo id="mongo" replica-set="${mongo.replicaSet}"> <mongo:options connections-per-host="${mongo.connectionsPerHost}" threads-allowed-to-block-for-connection-multiplier="${mongo.threadsAllowedToBlockForConnectionMultiplier}" connect-timeout="${mongo.connectTimeout}" max-wait-time="${mongo.maxWaitTime}" auto-connect-retry="${mongo.autoConnectRetry}" socket-keep-alive="${mongo.socketKeepAlive}" socket-timeout="${mongo.socketTimeout}" slave-ok="${mongo.slaveOk}" write-number="${mongo.writeNumber}" write-fsync="${mongodb.writeFsync}" /> </mongo:mongo>
配置文件common-config.properties
mongo.dbname = test_dbmongo.username = test_usermongo.password = test_pwdmongo.replicaSet = 192.168.2.193:27017,192.168.2.192:27017mongo.connectionsPerHost= 100mongo.threadsAllowedToBlockForConnectionMultiplier=50mongo.connectTimeout=3000mongo.maxWaitTime=5000mongo.autoConnectRetry=truemongo.socketKeepAlive=truemongo.socketTimeout=5000mongo.slaveOk=truemongo.writeNumber = 1mongodb.writeFsync = true
其他配置
<!-- 用户验证 --> <bean id="userCredentials" class="org.springframework.data.authentication.UserCredentials"> <constructor-arg name="username" value="${mongo.username}" /> <constructor-arg name="password" value="${mongo.password}" /> </bean> <!-- mongo的工厂,通过它来取得mongo实例,dbname为mongodb的数据库名,没有的话会自动创建 --> <bean id="mongoDbFactory" class="org.springframework.data.mongodb.core.SimpleMongoDbFactory"> <constructor-arg ref="mongo" /> <constructor-arg value="${mongo.dbname}" /> <constructor-arg ref="userCredentials" /> </bean> <bean id="mappingContext" class="org.springframework.data.mongodb.core.mapping.MongoMappingContext" /> <bean id="defaultMongoTypeMapper" class="org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper"> <constructor-arg name="typeKey"> <null /> </constructor-arg> </bean> <!-- collection的映射 --> <bean id="mappingMongoConverter" class="org.springframework.data.mongodb.core.convert.MappingMongoConverter"> <constructor-arg name="mongoDbFactory" ref="mongoDbFactory" /> <constructor-arg name="mappingContext" ref="mappingContext" /> <property name="typeMapper" ref="defaultMongoTypeMapper" /> </bean> <!-- mongodb的主要操作对象,所有对mongodb的增删改查的操作都是通过它完成 --> <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate"> <constructor-arg name="mongoDbFactory" ref="mongoDbFactory" /> <constructor-arg name="mongoConverter" ref="mappingMongoConverter" /> </bean>
Mongodb增删改查
1.Mongodb对象模型
Dynamic.java
@Document(collection = "Dynamic")public class Dynamic implements Serializable{ /** * */ private static final long serialVersionUID = 179822189115264434L; private String _id; private String userId; //用户ID private Date releaseDate;//发布日期 private double []loc = new double[2];//位置 public void setId(String _id) { this._id = _id; } public String getId() { return this._id; } public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public Date getReleaseDate() { return releaseDate; } public void setReleaseDate(Date releaseDate) { this.releaseDate = releaseDate; } public double[] getLoc() { return loc; } public void setLoc(double[] loc) { this.loc = loc; }}
2.代码示例
新增
Dynamic dynamic = New Dynamic();dynamic.setUserId("10023");// ...// set属性,自己补全// 转换为DBObjectDBObject dbObject = BeanUtil.bean2DBObject(dynamic); db.removeField("serialVersionUID");// 保存mongoTemplate.getCollection(collection).save(dbObject)
更新
普通更新
DBObject aim = new BasicDBObject("_id", id);DBObject setValue = new BasicDBObject();setValue.put("loc", loc.getLoc());// 更新的值,用$setDBObject updateSetValue = new BasicDBObject("$set", setValue);//更新,aim:where条件 updateSetValue:更新值 true:是否没有记录时插入 false:是否多行更新mongoTemplate.getCollection(collection).update(aim, updateSetValue , true, false);
数组更新
DBObject addAim = new BasicDBObject(); addAim.put("_id", id);//数据中push值DBObject updateSetValue = new BasicDBObject("$push", addedValue);//增加updateSetValue.put("$inc", new BasicDBObject("commentSize", 1));mongoTemplate.getCollection(collection).update(addAim, updateSetValue);
查询
单条查询
DBObject query = new BasicDBObject("_id", id);DBObject fields = new BasicDBObject();mongoTemplate.getCollection(collection).findOne(query, fields)
分页查询
int pageSize = 20;int pageNum = 1;DBObject fields = new BasicDBObject();//排序,-1 降序DBObject orderBy = new BasicDBObject("release_date", -1);//分页查询List<DBObject> list = new ArrayList<>();Cursor cursor = mongoTemplate.getCollection(collection) .find(query, fields).skip((pageNum - 1) * pageSize) .limit(pageSize).sort(orderBy);while (cursor.hasNext()) { list.add(cursor.next());}
范围查询
DBObject query = new BasicDBObject();// $lte 小于等于,$lt 小于query.put( "release_date", new BasicDBObject("$lte", DateUtil.parseDate( maxTime, DateStyle.YYYY_MM_DD_HH_MM_SS_SSS .getValue())));// $gte 大于等于,$gt 大于query.put( "release_date", new BasicDBObject("$gte", DateUtil.parseDate( minTime, DateStyle.YYYY_MM_DD_HH_MM_SS_SSS .getValue())));
in 和not in 查询
// $in 查询DBObject query = new BasicDBObject("qd_id", new BasicDBObject( "$in", idStr))// $nin 查询DBObject query = new BasicDBObject("qd_id", new BasicDBObject( "$nin", idStr))
or 查询
List orArry = new ArrayList<>(); orArry.add(new BasicDBObject("qd_id", new BasicDBObject( "$in", qd_ids.toArray()))); orArry.add(new BasicDBObject("_id", new BasicDBObject("$in", recommondIds.toArray()))); query.put("$or", orArry);
聚合查询sum和group by
Map retMap = new HashMap<>();// $group 分组,newsCount别名,$sum和,$commentSize字段名 String groupStr = "{$group:{_id:null,newsCount:{$sum:1},commentCount:{$sum:\"$commentSize\"},supportCount:{$sum:\"$supportSize\"}}}"; DBObject group = (DBObject) JSON.parse(groupStr); String minTime = (String)params.get("start") + " 00:00:00:000"; String maxTime = (String)params.get("end") + " 00:00:00:000"; BasicDBObject query = new BasicDBObject(); query.put( "release_date", new BasicDBObject("$gte", DateUtil.parseDate( minTime, DateStyle.YYYY_MM_DD_HH_MM_SS_SSS .getValue()))); query.put( "release_date", new BasicDBObject("$lte", DateUtil.parseDate( maxTime, DateStyle.YYYY_MM_DD_HH_MM_SS_SSS .getValue())).append("$gte", DateUtil.parseDate(minTime, DateStyle.YYYY_MM_DD_HH_MM_SS_SSS .getValue()))); DBObject match = new BasicDBObject("$match", query);// 聚合查询 AggregationOutput output = mongoTemplate.getCollection(collection).aggregate(match,group); for( Iterator< DBObject > it = output.results().iterator(); it.hasNext(); ){ BasicDBObject dbo = ( BasicDBObject ) it.next(); retMap = com.alibaba.fastjson.JSON.parseObject(dbo.toString(), Map.class); } return retMap;
LBS查询(附近的人)
if (query == null) query = new BasicDBObject();List<DBObject> pipeLine = new ArrayList<>();BasicDBObject pipeBasicDBObject = new BasicDBObject();pipeBasicDBObject.append("near", new double[] { longitude, latitude }).append("distanceField", "dist.calculated").append("spherical", true).append("query", query).append("distanceMultiplier", 6371);if (qType == 1) { double maxDistance = distance/6371.0000; pipeBasicDBObject.append("maxDistance", maxDistance);}BasicDBObject aggregate = new BasicDBObject("$geoNear", pipeBasicDBObject);BasicDBObject orderObject = new BasicDBObject("$sort", new BasicDBObject().append("dist.calculated", 1));pipeLine.add(aggregate);pipeLine.add(orderObject);int startNo = (pageNum-1)*pageSize;int limit = pageSize;if(pageNum == 1){ limit = limit+1;}else{ startNo = startNo+1;}if (qType == 1) { BasicDBObject skipObject = new BasicDBObject("$skip", startNo); pipeLine.add(skipObject);}BasicDBObject limitObject = new BasicDBObject("$limit", limit);pipeLine.add(limitObject);List<DBObject> list = new LinkedList<>();try { Cursor cursor = mongoTemplate.getCollection(collection).aggregate( pipeLine, AggregationOptions.builder().build()); while (cursor.hasNext()) { DBObject dBObject = cursor.next(); list.add(dBObject); }} catch (Exception e) { e.printStackTrace();}return list;
删除
DBObject deleAim = new BasicDBObject();deleAim.put("_id", id);mongoTemplate.getCollection(collection).remove(dbObject)
ps:上面示例不全,只附上了重要的代码。
至此,总共介绍了常用查询,聚合查询,删除,保存,geo查询等方法。
个人技术分享微信公众号,欢迎关注一起交流
1 0
- Spring MVC中使用Mongodb总结
- Spring MVC中使用Mongodb总结
- Mongodb总结4-Spring环境使用Mongodb
- spring mvc 3.2 使用总结
- Spring MVC+mongodb实践
- spring MVC 整合mongodb
- spring mvc mongodb
- spring mvc 中使用spring的validator
- spring mvc 中使用spring的validator
- spring mvc 中使用spring的validator
- spring mvc 中使用spring的validator
- Spring MVC 使用总结(一)
- Java 中使用 SPRING DATA - MONGODB 开发
- Spring Boot中使用MongoDB数据库
- Spring Boot中使用MongoDB数据库
- Spring Boot中使用MongoDB数据库
- Spring Boot中使用MongoDB数据库
- Spring Boot中使用MongoDB数据库
- Android学习之动画
- Git快速入门
- powdesigner 物理模型生成SQL脚本的一些问题
- 垃圾回收GC,内存管理
- 错误处理:The hierarchy of the type MyMethodBeforeAdvice is inconsistent
- Spring MVC中使用Mongodb总结
- Object.keys()枚举属性名
- Core Animation
- Bag of Word
- VC 多屏控制显示文章整理
- pthread_t http://baike.baidu.com/link?url=RqlQDsuzwglrupfhdmk8nqPkvLSsdSPArFVn9k2nZitvJroW313ALYlsM
- Python开发基础
- 微软算法100道题-----第六题
- PowerDesigner(CDM—PDM—SQL脚本的转换流程) 随笔