MongoDB的优缺点以及springboot中的使用
MongoDB简介
一款介于关系数据库和非关系数据库之前的产品,基于分布式文件存储的数据库,旨再为WEB引用提供可扩展的高性能数据存储解决方案,将数据存储为一个文档(类似JSON对象),数据结构由键值(key=>value)对组成支持丰富的查询表达,可以设置任何属性的索引;支持副本集、分片。
总而言之: MongoDB介于缓存与数据库之间,存取速度逊于缓存但远远高于传统数据库。
MongoDB的优点:
1、弱一致性(最终一致),更能保证用户的访问速度
2、文档结构的存储方式,能够更便捷的获取数据
对于一个层级式的数据结构来说,如果要将很多的数据使用扁平式的、表状的结构来保存数据,这不管是在查询还是获取数据时都会很困难。
3、第三方支持丰富。
这是它跟其它的NoSQL相比,MongoDB也具有的优势,因为现在网络上的很多NoSQL开源数据库完全属于社区型的,没有官方支持,给使用者带来了很大的风险。
而开源的文档数据库MongoDB背后有商业公司为它提供商业培训和支持。
4、性能优越
在使用场合下,千万级别的文档对象,近10G的数据,对有索引的ID的查询不会比mysql慢,而对非索引字段的查询,则是全面胜出。 mysql实际无法胜任大数据量下任意字段的查询,而mongodb的查询性能可以,同时它的写入性能也很厉害,可以写入百万级别的数据。
MongoDB的缺点:
1、MongoDB不支持事务操作
所以事务要求严格的系统,比如银行系统就不能用它。
2、MongoDB占用空间过大
2.1、空间的预分配:
当MongoDB的空间不足时它就会申请生成一大块硬盘空间,而且申请的量都是有64M、128M、256M来增加直到2G为单个文件的较大体积,并且随着数量叠增,可以在数据目录下看到整块生成而且不断递增的文件。
2.2、删除记录不释放空间:
这很容易理解,为避免记录删除后的数据的大规模挪动,原记录空间不删除,只标记“已删除”即可,以后还可以重复利用。
3、(开发和IT运营要注意)MongoDB没有MySQL那样成熟的维护工具
MongoDB的使用场景:
(1)游戏场景
使用MongoDB存储游戏用户信息、装备、积分等,直接以内嵌文档的形式存储,方便查询、更新。
(2)物流场景
使用MongoDB存储订单信息、订单状态、物流信息,订单状态在运送过程中飞速迭代、以MongoDB内嵌数组的形式来存储,一次查询就能将订单所有的变更查出来,牛逼plus。
(3)社交场景
使用MongoDB存储用户信息,朋友圈信息,通过地理位置索引实现附近的人、定位功能。
(4)物联网场景
使用MongoDB存储设备信息、设备汇报的日志信息、并对这些信息进行多维度分析。
(5)视频直播
使用MongoDB存储用户信息、点赞互动信息。
MongoDB的使用场景总结:
1.数据量大
2.读写操作频繁
3.数据价值较低,对事务要求不高
MongoDB的java代码
YML配置信息
spring:
data:
mongodb: #mongodb数据库
host: localhost #连接服务器地址(默认本地127.0.0.1)
port: 27017 #端口号 (默认27017)
database: fan #指定连接的数据库
<!-- 引入SpringBoot集成MongoDB的Jar包 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
package com.fan.mongodb;
import com.fan.dto.PersonDTO;
import com.fan.entity.Person;
import com.fan.vo.ResponseVO;
import com.mongodb.client.result.DeleteResult;
import com.mongodb.client.result.UpdateResult;
import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
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.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author およそ神
* @version JDK 1.8
*/
@RestController
@RequestMapping(value = "/mongo")
@Api(tags={"mongo数据库CRUD测试"})
@Slf4j
public class MongodbController {
/** MongoTemplate 实现构建对MongoDB的CRUD */
@Autowired
private MongoTemplate mongoTemplate;
/**
* 新增
* @param person
* @return
*/
@PostMapping(value = "/save")
public ResponseVO save(Person person) {
person.setUpdateby("fan");
Person save = this.mongoTemplate.save(person);
System.out.println(save);
return ResponseVO.ok();
}
@PostMapping(value = "/update")
public ResponseVO update(PersonDTO person) {
Query query = new Query(Criteria.where("id").is(person.getId()));
Update update = new Update().set("name",person.getName()).set("age",person.getAge());
// UpdateResult result = this.mongoTemplate.updateFirst(query, update, Person.class);
UpdateResult result = this.mongoTemplate.updateMulti(query, update, Person.class);
return ResponseVO.okHasData(result);
}
@GetMapping(value = "/find")
public ResponseVO find(PersonDTO person) {
Query query = new Query(Criteria.where("id").is(person.getId()));
Person result = mongoTemplate.findOne(query, Person.class);
return ResponseVO.okHasData(result);
}
@PostMapping(value = "/remove")
public ResponseVO remove(PersonDTO person) {
Query query = new Query(Criteria.where("id").is(person.getId()));
DeleteResult result = mongoTemplate.remove(query, Person.class);
return ResponseVO.okHasData(result);
}
}
sql
//db.book.save({"name":"springboot"});
//db.book.save({"age":"666"});
//db.book.insert({"name":"mango good"});
//db.book.save({"name":"springboot",type:"工具书"});
//2 查询所有数据2种写法
//db.book.find()
//db.getCollection("book").find()
//2 条件查询
//db.book.find({type:"工具书"}).
//db.book.find({name:"mango good"})
//3 修改"name":"springboot"的数据为"name","springboot2"
//update:遇到满足条件的第一条数据修改
//db.book.update({"name":"springboot"},{$set:{"name":"springboot2"}})
//updateMany :修改所有满足条件的
//db.book.updateMany({"name":"springboot"},{$set:{age:"23"}})
//updateOne:修改满足条件的第一条数据
//db.book.updateOne({"name":"springboot"},{$set:{type:"springboot3","age":"666"}})
//4 删除
//db.book.remove({type:"工具书"})