SpringBoot中使⽤MongoDB增删改查本⽂快速⼊门,MongoDB 结合SpringBoot starter-data-mongodb 进⾏增删改查
1、什么是MongoDB ?
MongoDB 是由C++语⾔编写的,是⼀个基于分布式⽂件存储的开源数据库系统。
在⾼负载的情况下,添加更多的节点,可以保证服务器性能。
MongoDB 旨在为WEB应⽤提供可扩展的⾼性能数据存储解决⽅案。
MongoDB 将数据存储为⼀个⽂档,数据结构由键值(key=>value)对组成。
MongoDB ⽂档类似于 JSON 对象。字段值可以包含其他⽂档,数组及⽂档数组。
![ ][1]
2、MongoDB 优缺点
优点
⽂档结构的存储⽅式,能够更便捷的获取数据
内置GridFS,⽀持⼤容量的存储
海量数据下,性能优越
动态查询
全索引⽀持,扩展到内部对象和内嵌数组
查询记录分析
快速,就地更新
⾼效存储⼆进制⼤对象 (⽐如照⽚和视频)
复制(复制集)和⽀持⾃动故障恢复
内置 Auto- Sharding ⾃动分⽚⽀持云级扩展性,分⽚简单
MapReduce ⽀持复杂聚合
商业⽀持,培训和咨询
缺点
不⽀持事务操作
MongoDB 占⽤空间过⼤ (不过这个确定对于⽬前快速下跌的硬盘价格来说,也不算什么缺点了)MongoDB没有如MySQL那样成熟的维护⼯具
⽆法进⾏关联表查询,不适⽤于关系多的数据
复杂聚合操作通过mapreduce创建,速度慢
模式⾃由,⾃由灵活的⽂件存储格式带来的数据错
MongoDB 在你删除记录后不会在⽂件系统回收空间。除⾮你删掉数据库。但是空间没有被浪费3、优缺点详细解释
1.内置GridFS,⽀持⼤容量的存储:
GridFS是⼀个出⾊的分布式⽂件系统,可以⽀持海量的数据存储。
内置了GridFS了MongoDB,能够满⾜对⼤数据集的快速范围查询。
2.内置 Auto- Sharding ⾃动分⽚⽀持云级扩展性,分⽚简单
提供基于Range的Auto Sharding机制:
⼀个collection可按照记录的范围,分成若⼲个段,切分到不同的Shard上。
Shards可以和复制结合,配合Replica sets能够实现Sharding+fail-over,不同的Shard之间可以负载均衡。
查询是对客户端是透明的。客户端执⾏查询,统计,MapReduce等操作,这些会被MongoDB⾃动路由到后端的数据节点。
这让我们关注于⾃⼰的业务,适当的 时候可以⽆痛的升级。MongoDB的Sharding设计能⼒最⼤可⽀持约20 petabytes,⾜以⽀撑⼀般应⽤。
这可以保证MongoDB运⾏在便宜的PC服务器集上。PC集扩充起来⾮常⽅便并且成本很低,避免了“sharding”操作的复杂性和成本。
3.海量数据下,性能优越:
在使⽤场合下,千万级别的⽂档对象,近10G的数据,对有索引的ID的查询不会⽐mysql慢,⽽对⾮索引字段的查询,则是全⾯胜出。mysql实际⽆法胜任⼤数据量下任意字段的查询,⽽mongodb的查询性能实在让我惊讶。写⼊性能同样很令⼈满意,同样写⼊百万级别的数 据,mongodb⽐我以前试⽤过的couchdb要快得多,基本10分钟以下可以解决。补上⼀句,观察过程中mongodb都远算不上是CPU 杀⼿。
4.全索引⽀持,扩展到内部对象和内嵌数组
索引通常能够极⼤的提⾼查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个⽂件并选取那些符合查询条件的记录。
这种扫描全集合的查询效率是⾮常低的,特别在处理⼤量的数据时,查询可以要花费⼏⼗秒甚⾄⼏分钟,这对⽹站的性能是⾮常致命的。
索引是特殊的数据结构,索引存储在⼀个易于遍历读取的数据集合中,索引是对数据库表中⼀列或多列的值进⾏排序的⼀种结构。
5.MapReduce ⽀持复杂聚合
MongoDB中聚合(aggregate)主要⽤于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。
有点类似sql语句中的 count(*)。
与关系型数据库相⽐,MongoDB的缺点:
mongodb不⽀持事务操作:
所以事务要求严格的系统(如果银⾏系统)肯定不能⽤它。
mongodb不⽀持事务操作:
所以事务要求严格的系统(如果银⾏系统)肯定不能⽤它。
mongodb占⽤空间过⼤:
关于其原因,在官⽅的FAQ中,提到有如下⼏个⽅⾯:
1、空间的预分配:为避免形成过多的硬盘碎⽚,mongodb每次空间不⾜时都会申请⽣成⼀⼤块的硬盘空间,⽽且申请的量从64M、
128M、256M那 样的指数递增,直到2G为单个⽂件的最⼤体积。随着数据量的增加,你可以在其数据⽬录⾥看到这些整块⽣成容量不断递增的⽂件。
2、字段名所占⽤的空间:为了保持每个记录内的结构信息⽤于查询,mongodb需要把每个字段的key-value都以BSON的形式存储,如果value域相对于key域并不⼤,⽐如存放数值型的数据,则数据的overhead是最⼤的。⼀种减少空间占⽤的⽅法是把字段名尽量取短⼀些,这样占⽤ 空间就⼩了,但这就要求在易读性与空间占⽤上作为权衡了。
3、删除记录不释放空间:这很容易理解,为避免记录删除后的数据的⼤规模挪动,原记录空间不删除,只标记“已删除”即可,以后还可以重复利⽤。
4、可以定期运⾏db.repairDatabase()来整理记录,但这个过程会⽐较缓慢
MongoDB没有如MySQL那样成熟的维护⼯具,这对于开发和IT运营都是个值得注意的地⽅。
4、环境需要
64位操作系统,建议使⽤Linux / Unix /
CentOs 7.3
MongoDB 3.6.2
5、环境安装
请参考我的另⼀篇⽂章
6、新加项⽬
新建⼀个 maven 项⽬,这⾥就不详细操作了,⼤家都会的
不过也可以下载我的⽰例源码,下载地址如下
MongoDB是⼀个开源NoSQL⽂档数据库,它使⽤类似JSON的模式⽽不是传统的基于表格的关系数据。Spring Boot为MongoDB提供了⼀些便利,包括 spring-boot-starter-data-mongodb “Starter”。
7、添加依赖
在POM 中添加如下依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
8、配置⽂件
在配置⽂件 application.properties 添加如下配置
spring.application.name=spring-boot-mongodb
# mongodb
db.uri=mongodb://192.168.252.121:20000,192.168.252.122:20000,192.168.252.12:20000/demo
多个IP集的配置:
db.uri=mongodb://user:ample:ample:23456/test
9、DemoEntity
spring-data-mongodb中的实体映射是通过MongoMappingConverter这个类实现的。它可以通过注释把java类转换为mongodb的⽂档。
它有以下⼏种注释:
@Id - ⽂档的唯⼀标识,在mongodb中为ObjectId,它是唯⼀的,通过时间戳+机器标识+进程ID+⾃增计数器(确保同⼀秒内产⽣的Id不会冲突)构成。
@Document - 把⼀个java类声明为mongodb的⽂档,可以通过collection参数指定这个类对应的⽂档。
@Document(collection=“mongodb”) mongodb对应表
@DBRef - 声明类似于关系数据库的关联关系。ps:暂不⽀持级联的保存功能,当你在本实例中修改了DERef对象⾥⾯的值时,单独保存本实例并不能保存DERef引⽤的对象,它要另外保存,如下⾯例⼦的Person和Account。
@Indexed - 声明该字段需要索引,建索引可以⼤⼤的提⾼查询效率。
@CompoundIndex - 复合索引的声明,建复合索引可以有效地提⾼多字段的查询效率。
@GeoSpatialIndexed - 声明该字段为地理信息的索引。
@Transient - 映射忽略的字段,该字段不会保存到mongodb。
@PersistenceConstructor - 声明构造函数,作⽤是把从数据库取出的数据实例化为对象。该构造函数传⼊的值为从DBObject中取出的数据
@Document(collection ="demo_collection")
public class DemoEntity implements Serializable {
@Id
private Long id;
private String title;
private String description;
private String by;
private String url;
省略 getter setter
}
10、Demo DAO 接⼝
提供增删改查 MongoDB 接⼝
db;
public interface DemoDao {
void saveDemo(DemoEntity demoEntity);
void removeDemo(Long id);
void updateDemo(DemoEntity demoEntity);
DemoEntity findDemoById(Long id);
}
11、Demo DAO 实现
提供增删改查 MongoDB 接⼝实现
Spring Data Mongo提供了⼀个 MongoTemplate类似于Spring的设计的类JdbcTemplate。和JdbcTemplateSpring Boot⼀样,⾃动配置⼀个bean来简单地注⼊:
/**
* 描述: Demo DAO 实现
*
* @author yanpenglei
* @create 2018-02-03 16:57
**/
@Component
public class DemoDaoImpl implements DemoDao {
@Resource
private MongoTemplate mongoTemplate;
@Override
public void saveDemo(DemoEntity demoEntity){
mongoTemplate.save(demoEntity);
}
@Override
public void removeDemo(Long id){
}
@Override
jdbctemplate查询一条数据public void updateDemo(DemoEntity demoEntity){
Query query =new Query(Criteria.where("id").Id()));
Update update =new Update();
update.set("title", Title());
update.set("description", Description());
update.set("by", By());
update.set("url", Url());
mongoTemplate.updateFirst(query, update, DemoEntity.class);
}
@Override
public DemoEntity findDemoById(Long id){
Query query =new Query(Criteria.where("id").is(id));
DemoEntity demoEntity = mongoTemplate.findOne(query, DemoEntity.class);
return demoEntity;
}
}
12、启动服务
运⾏启动类
db;
@SpringBootApplication
public class SpringBootMongodbApplication {
public static void main(String[] args){
SpringApplication.run(SpringBootMongodbApplication.class, args);
}
}
13、单元测试
单元测试,提供mongodb 的 demo 库的 demo_collection 集合的增删改查
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论