1、介绍:
MongoDB是介于关系型数据库和非关系型数据库中间的一个产品,是非关系型数据库中最丰富的,最像关系型数据的。
2、与redis对比
Redis:
- Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
- Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,在set,hash等数据结构的存储。
- Redis支持数据的备份,即master-slave模式的数据备份
- 性能极高- Redis能读的速度是110000次/s,写的速度是81000次/s
- 丰富的数据类型-Redis支持二进制案例的Strings,Lists,Hashes,Setes及Ordered Sets数据类型操作。
- 原子 - Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
- 丰富的特性 - Redis还支持publish/subscribe,通知,key过期等等特性。
MongoDB: - 模式自由:可以把不同结构的文档存储在同一个数据库里
- 面向集合的存储:适合存储JSON风格文件的形式
- 完整的索引支持,对任何属性可索引
- 复制和高可用性:支持服务器之间的数据复制,支持主-从模式及服务器之间的相互复制。复制的主要目的是提供冗余及自动故障转移
- 自动分片:支持水平的数据库集群,可动态添加额外的机器
6.丰富的查询:支持丰富的查询表达方式,查询指令使用JSON形式额标记,可轻易查询文档中的内嵌的对象及数组 - 快速就地更新:查询优化器会分析查询表达式,并生成一个高效的查询计划
8.高效的传统存储方式:支持二进制数据及大型对象
使用场景的不同:
MongoDB适用于
①网站数据:
②缓存:
③大尺寸、低价值的数据也是MongoDB的最佳选择,比如日志,用户评论啥的
④高伸缩的场景,非常是个由数十或者数百台服务器组成的数据库
⑤用于对象及json数据的存储,MongoDB的bson数据格式非常适合文档格式化的存储及查询。
Redis应用场景:
① 用来做缓存-redis的所有数据时放在内存中的
② 可以在某些特定应用场景下替代传统数据库–比如社交类的应用
③ 在一些大型系统中,巧妙的实现一些特定的功能:tomcat集成redis实现session共享、临时订单数据缓存等
3.代码实现
作为springboot项目,还是老规矩引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
其次就是配置yml文件
server:
servlet:
context-path: /mongodb-demo
port: 8080
#mongodb配置
spring:
data:
mongodb:
database: test
host: 127.0.0.1
port: 27017
这是我本地的MongoDB,直接去官网下载最新的就行,傻瓜式下一步,注意:第一个选择时默认或者自定义安装目录,还有最后一步的时候把install那个勾取消,否则需要很久,需要可视化工具也可以自己去官网下载。这里就不细讲了。
3.就是引用了只要注入下面这个接口就可以了,里面封装了所有针对MongoDB的操作,增删改查
@Autowired
private MongoTemplate mongoTemplate;
@Service
public class MongoDbService {
private static final Logger log= LoggerFactory.getLogger(MongoDbService.class);
@Autowired
private MongoTemplate mongoTemplate;
/**
* 保存对象
* @param user
* @return
*/
public boolean save(UserInfo user){
mongoTemplate.save(user);
return true;
}
/**
* 保存对象
* @param user
* @param conllection 集合名
* @return
*/
public boolean save(UserInfo user,String conllection){
mongoTemplate.save(user,conllection);
return true;
}
public List<UserInfo> findAll(){
return mongoTemplate.findAll(UserInfo.class);
}
public UserInfo findById(String id){
Query query = new Query(Criteria.where("_id").is(id));
return mongoTemplate.findOne(query,UserInfo.class);
}
public String update(UserInfo t){
Query query = new Query(Criteria.where("_id").is(t.getId()));
Update update = new Update()
.set("updateTime", new Date());
//updateFirst 更新查询返回结果集的第一条
mongoTemplate.updateFirst(query, update, UserInfo.class);
return "success";
}
public String delete(UserInfo t){
mongoTemplate.remove(t);
return "success";
}
public String deleteById(String id){
UserInfo user= findById(id);
mongoTemplate.remove(user);
return "success";
}
}
上面的方法我们可以看出,其实保存是支持只保存对象或者自定义集合名,如果不自定义就是以对象名为集合名,同时我们还可以看出MongoDB是支持字段过滤的,所以说他是最接近关系型数据库的。
4、测试案例
@RunWith(SpringRunner.class)
@SpringBootTest
public class MongoDBServiceTest {
@Autowired
private MongoDbService mongoDbService;
@Test
public void save(){
UserInfo userInfo=new UserInfo();
userInfo.setId("2");
userInfo.setName("丽丽");
userInfo.setSex("0");
userInfo.setCreateTime(new Date());
mongoDbService.save(userInfo);
}
@Test
public void saveWithConName(){
UserInfo userInfo=new UserInfo();
userInfo.setId("2");
userInfo.setName("丽丽");
userInfo.setSex("0");
userInfo.setCreateTime(new Date());
mongoDbService.save(userInfo,"cxwUserInfo");
}
@Test
public void findAll(){
List<UserInfo> list= mongoDbService.findAll();
for(UserInfo user :list){
System.out.println(user.getName()+":"+user.getId());
}
}
}
这里只挑选了部分方法测试,不过作为一个合格的程序员一定要有写测试案例的习惯,我这里是偷懒,不要向我学习。
代码:https://gitee.com/wangzaiwork/mongodb-demo.git
---------------------------写的不好仅供参考--------------------------------------------