MongoDB 针对嵌套对象,多层级结构存储,增删改查
2016-04-29 13:43
465 查看
简要介绍NOSQL
mongoDB 是属于NOSQL.什么是nosql,NoSQL(NoSQL = Not Only SQL ),意即”不仅仅是SQL”。NoSQL,指的是非关系型的数据库。NoSQL有时也称作Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称。
NoSQL用于超大规模数据的存储。(例如谷歌或Facebook每天为他们的用户收集万亿比特的数据)。这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。
mongodb介绍
MongoDB的提供了一个面向文档存储,操作起来比较简单和容易。你可以在MongoDB记录中设置任何属性的索引 (如:FirstName=”Sameer”,Address=”8 Gandhi Road”)来实现更快的排序。你可以通过本地或者网络创建数据镜像,这使得MongoDB有更强的扩展性。
MongoDb 使用update()命令可以实现替换完成的文档(数据)或者一些指定的数据字段 。
Mongodb中的Map/reduce主要是用来对数据进行批量处理和聚合操作。
Map和Reduce。Map函数调用emit(key,value)遍历集合中所有的记录,将key与value传给Reduce函数进行处理。
Map函数和Reduce函数是使用Javascript编写的,并可以通过db.runCommand或mapreduce命令来执行MapReduce操作。
GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件。
MongoDB允许在服务端执行脚本,可以用Javascript编写某个函数,直接在服务端执行,也可以把函数的定义存储在服务端,下次直接调用即可。
MongoDB支持各种编程语言:RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言。
MongoDB安装简单。
spring 集成使用mongodb
我自己使用mongodb ,是用spring 中带的mongodb包来使用的。只要的jar包是,下面是maven引用包<dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-java-driver</artifactId> <version>2.13.0</version> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-mongodb</artifactId> <version>1.6.2.RELEASE</version> </dependency>
配置mongodb 数据源
数据连接地址。用一个properties保存。mongo.dburl=172.16.40.18:27017 mongo.dbname=qingxing mongo.connectionsPerHost=100 mongo.threadsAllowedToBlockForConnectionMultiplier=4 mongo.maxWaitTime=1500 mongo.socketTimeout=1500 mongo.connectTimeout=1000 mongo.autoConnectRetry=true mongo.socketKeepAlive=true mongo.slaveOk=true
在spring 配置文件中配置数据源
<!-- ****************************** mongoDB begin ********************************** --> <!-- 一些连接属性的设置 --> <mongo:mongo id="mongo" replica-set="${mongo.dburl}"> <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> <!-- mongo的工厂,通过它来取得mongo实例,dbname为mongodb的数据库名,没有的话会自动创建 --> <mongo:db-factory dbname="${mongo.dbname}" mongo-ref="mongo" /> <bean id="mappingContext" class="org.springframework.data.mongodb.core.mapping.MongoMappingContext" /> <!-- 去除集合里的_class属性 --> <bean id="defaultMongoTypeMapper" class="org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper"> <constructor-arg name="typeKey"> <null /> </constructor-arg> </bean> <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> <!-- 映射转换器,扫描back-package目录下的文件,根据注释,把它们作为mongodb的一个collection的映射 --> <mongo:mapping-converter base-package="com.qx.mongodb.doc" /> <!-- mongodb bean的仓库目录,会自动扫描扩展了MongoRepository接口的接口进行注入 --> <mongo:repositories base-package="com.qx.mongodb.dao" /> <!-- ***************************** mongoDB over ********************************** -->
对象的操作。建立映射关系对应。
/** * 教练版的语音播报 * * @author luoyang * */ @Document(collection = "mg_voice") //存入的表名称 public class MgVoice { @Id //标志为主键 private Long cid; /** * M 男声 F 女声 */ private String voiceType; /** * 速度 */ private Integer voiceSpeed; private List<MgVoiceLibrary> voiceLibrarys; private List<MgVoicePlan> voicePlans; public Long getCid(){ return cid; } ....
内嵌对象 MgVoiceLibrary
/** * 教练版的语音库 * * @author luoyang * */ public class MgVoiceLibrary { private String lid; /** * 2 科目二 3 科目三 4 起步灯光 */ private Integer type; private String title; private String content; /** * 0 不是 1 是 */ private Integer isTemp; private String tempCode; private String tempTitle; private String tempContent; private Date updateDate; public String getLid(){ return lid; } .....
增删改查操作
在做一下的操作之前先介绍spring 中操作mongodb的类。在之前的配置中可以看到,我们已经引入了一个类:mongoTemplate
import org.springframework.data.mongodb.core.MongoTemplate;
其中所引用的包
import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Update; import org.springframework.stereotype.Service; import com.alibaba.fastjson.JSON; import com.mongodb.BasicDBObject;
所以在我们的service 层 ,利用注解直接使用这个类
@Autowired protected MongoTemplate mongoTemplate;
新增
//新增很简单,将新增的对象设置好值,直接保存 MgVoice mgVoice = new MgVoice(); mgVoice.set ....// mongoTemplate.save(mgVoice);
修改。(修改对象的直接属性)
{ "cid": 1100658, //教练ID "voiceType": "F",//语音类型 F女声 M 男声 "voiceSpeed": 30, //语音速度 "voiceLibrarys": [ { "lid": "p2_b9dc7616-b476-40ee-8fd7-982711cece98",//语音ID "type": 2,//语音类型 2科目二 3科目三 "title": "上坡起步", //标题 "content": "上坡起步和定点停车",//内容 "isTemp": 1, //是否是模板 0 不是 1 是 "tempCode": "k2_spqb",//模板代码 ,也是模板图片标题 "tempTitle": "上坡起步",//模板标题 "tempContent": "上坡起步和定点停车",//模板内容,供恢复默认使用 "updateDate": "2016-04-28 00:00:00" }, { "lid": "p3_ead65a9a-c659-4f55-a7d4-067d8935ee19", "type": 3, "title": "靠边停车", "content": "请靠边停车", "isTemp": 1, "tempCode": "k3_kbtc", "tempTitle": "靠边停车", "tempContent": "请靠边停车", "updateDate": "2016-04-28 00:00:00" }] }
我们要修改对象中的 voiceType 和 voiceSpeed 属性 代码如下
@Override public void updateCfg(Long cid, Integer speed, String type){ Criteria criteria = Criteria.where("cid").is(cid); Query query = new Query(criteria); Update update = Update.update("voiceType", type).set("voiceSpeed", speed); mongoTemplate.updateFirst(query, update, MgVoice.class); }
修改。(对象中的 嵌套对象)
我们要修改 voiceLibrarys 数组 中 lid = “p2_b9dc7616-b476-40ee-8fd7-982711cece98”,的对象中的 title 和 content 属性。使用set
//是修改 Query query = new Query(Criteria.where("cid").is(cid).and("voiceLibrarys.lid").is(lid)); Update update = Update.update("voiceLibrarys.$.title", title).set("voiceLibrarys.$.content", content); mongoTemplate.updateFirst(query, update, MgVoice.class);
如果是要再voiceLibrarys 这个数组中新增一个对象 使用addToset
//语音的ID 为空是新增 lid = getCreateId(type); MgVoiceLibrary voice = new MgVoiceLibrary(); voice.setLid(lid); voice.setType(type); voice.setTitle(title); voice.setContent(content); voice.setIsTemp(0); voice.setUpdateDate(RDate.getCurrentDate()); Query query = Query.query(Criteria.where("cid").is(cid)); Update update = new Update(); update.addToSet("voiceLibrarys", voice); mongoTemplate.upsert(query, update, MgVoice.class);
如果要删除数组voiceLibrarys 中的一个对象,对象lid=”p2_b9dc7616-b476-40ee-8fd7-982711cece98” 。 使用pull 属性
//删除 语音 cid 记录的ID plid 数组中的一个标记 Query query = Query.query(Criteria.where("cid").is(cid)); BasicDBObject s = new BasicDBObject(); s.put("lid", plid); Update update = new Update(); update.pull("voiceLibrarys", s); mongoTemplate.updateFirst(query, update, MgVoice.class);
除了以上的操作 还有一些属性,例如 unset.
如果update.upset 一个数组。 就会清空对象,但是数组大小不会变。
modifies
使用 update.modifies(key) 。 就会把这个对象里面除了ID 以外的值全部删除。
如果对象是这样的。voiceLibrarys 是一个对象,不是数组。同样要修改title 和 content 对象。
{ "cid": 1100658, //教练ID "voiceType": "F",//语音类型 F女声 M 男声 "voiceSpeed": 30, //语音速度 "voiceLibrarys": { "lid": "p2_b9dc7616-b476-40ee-8fd7-982711cece98",//语音ID "type": 2,//语音类型 2科目二 3科目三 "title": "上坡起步", //标题 "content": "上坡起步和定点停车",//内容 "isTemp": 1, //是否是模板 0 不是 1 是 "tempCode": "k2_spqb",//模板代码 ,也是模板图片标题 "tempTitle": "上坡起步",//模板标题 "tempContent": "上坡起步和定点停车",//模板内容,供恢复默认使用 "updateDate": "2016-04-28 00:00:00" } }
代码
//是修改 Query query = new Query(Criteria.where("cid").is(cid)); Update update = Update.update("voiceLibrarys.title", title).set("voiceLibrarys.content", content); mongoTemplate.updateFirst(query, update, MgVoice.class);
如果要删除整条记录。 使用remove
@Override public boolean removeVoice(Long cid){ //删除 语音 Query query = Query.query(Criteria.where("cid").is(cid)); mongoTemplate.remove(query, MgVoice.class); return true; }
这里只是简单的介绍一些基本的操作方法。
本人只是简单的看了一下。spring mongodb源码包中的代码。源码包中 也并没有写的很详细。只是给了其他的文档地址。例如
/** * Update using the {@literal $pull} update modifier * * @see http://docs.mongodb.org/manual/reference/operator/update/pull/ * @param key * @param value * @return */ public Update pull(String key, Object value) { addMultiFieldOperation("$pull", key, value); return this; }
根据
http://docs.mongodb.org/manual/reference/operator/update/pull/
再去查看一些基本的方法的使用。
相关文章推荐
- MongoDB -- MongoClient连接池用法
- MongoDB学习笔记-查询
- MongoDB分片集群还原
- MongoDB入门教程(一)
- Mongodb 创建索引
- nagios监控mongodb
- Node.js和MongoDB——从MongoJS开始
- mogoTemplate 模板 实现mongodb java的操作 ,根据经纬度查询周边
- mongodb lbs 坐标定位 java操作版本
- Java操作MongoDB模糊查询和分页查询
- MongoDB入门教程(一)
- Mongodb事务模拟
- mongodb副本集的配置及node.js的使用
- MongoDB入门
- 提升 MongoDB 安全性的 10 个提示
- NoSQL Mongodb的快速入门
- mongodb csv 文件导入数据库,删除特定字段
- mongodb的用户管理及安全认证
- 使用MongoDB 记录业务日志
- MongoDB查询语法