Mongo介绍及SpringBoot整合Mongo基本CRUD操作

Mongo介绍及SpringBoot整合Mongo基本CRUD操作

练习源码:赋gitee地址:https://gitee.com/xzq25_com/mongo-exercise

MongoDB介绍:Mongo是一个基于分布式文件存储的数据库,由C++编写,属于Nosql中最接近Sql的数据库,Mongo的目的是提供可扩展的高性能数据库存储解决方案。

Mongo高可用的基础是提供的副本集和分片的特性
一:副本集
在这里插入图片描述
1、主节点(Primary–图中的M):接收所有的写请求,然后把修改同步到所有从节点。一个Replica Set只能有一个Primary节点,当Primar挂掉后,其他Secondary或者Arbiter节点会重新选举出来一个主节点。默认读请求也是发到Primary节点处理的,需要转发到Secondary需要客户端修改一下连接配置。

2、副本节点(Secondary–图中的S):与主节点保持同样的数据集。当主节点挂掉的时候,参与选主。可以通过设置使备节点提供查询服务,这样就可以减少主节点的压力,当客户端进行数据查询时,请求自动转到备节点上。这个设置叫做Read Preference Modes

3、主节点负责数据的写入和更新,并在更新数据的同时,将操作信息写入名为 oplog 的日志文件当中。从节点会定时轮询读取 oplog 日志,根据日志内容同步更新自身的数据,保持与主节点一致。

4、副本集中的各节点会通过心跳信息来检测各自的健康状况(副本节点中有相互的心跳机制,同时跟主节点也有心跳),当主节点出现故障时,多个从节点会触发一次新的选举操作,并选举其中一个作为新的主节点。为了保证选举票数不同,副本集的节点数保持为奇数。MongoDB 的副本集是自带故障转移功能的主从复制。
.
.
二:分片
在这里插入图片描述
1、 副本集可以解决主节点发生故障导致数据丢失或不可用的问题,但遇到需要存储海量数据的情况时,副本集机制就束手无策了。副本集中的一台机器可能不足以存储数据,或者说集群不足以提供可接受的读写吞吐量。这就需要用到 MongoDB 的分片(Sharding)技术,这也是 MongoDB 的另外一种集群部署模式。(副本集是对一个主节点的操作,所以高并发,大数据量的写就会让一台机器受不了,就算能读写分离,但是也不行)

     MongoDB 的分片集群,需要三个重要的组件,
     A:Shard Server(分片服务器)B:Config Server(配置服务器)
     C:Route Server(路由服务器)

2、Shard Server: 每个 Shard Server 都是一个 mongod 数据库实例,用于存储实际的数据块。整个数据库集合分成多个块存储在不同的 Shard Server 中。在实际生产中,一个 Shard Server 可由几台机器组成一个副本集来承担,防止因主节点单点故障导致整个系统崩溃。(实际存储,且可以使用副本集来增强高可用性)
Config Server: 这是独立的一个 mongod 进程,保存集群和分片的元数据,在集群启动最开始时建立,保存各个分片包含数据的信息。(相当于注册中心,记录各个分片的位置)

3、Route Server: 这是独立的一个 mongos 进程,Route Server 在集群中可作为路由使用,客户端由此接入,让整个集群看起来像是一个单一的数据库,提供客户端应用程序和分片集群之间的接口。Route Server 本身不保存数据,启动时从 Config Server 加载集群信息到缓存中,并将客户端的请求路由给每个 Shard Server,在各 Shard Server 返回结果后进行聚合并返回客户端。(最后这句话有没有想分布式事务的二次提交的功能.~~~~)

MongoDB不适用的应用场景在某些场景下
MongoDB作为一个非关系型数据库有其局限性。MongoDB不支持事务操作,所以需要用到事务的应用建议不用MongoDB,另外MongoDB目前不支持join操作,需要复杂查询的应用也不建议使用MongoDB。

Mongo和Mysql的选择:
1、如果会频繁使用事务和关联查询,并且最求服务的稳定性最好还是选用MySQL
2、如果数据格式不确定,却少数据库管理人员,不怎么使用关联查询和事务,不是特别追求服务的稳定性可以使用MongoDB
3、不是很重要的数据可以使用MongoDB,比较重要的使用可以用使用MySQL。
.
.
SpringBoot整合Mongo:操作有两种方式:

1,通过MongoTemplate的方式访问
2,通过MongoRepository的方式访问
3MongoRepository操作简单,MongoTemplate操作灵活,项目中可以
灵活适用这两种方式操作mongodb,MongoRepository的缺点是不够灵活,
MongoTemplate正好可以弥补不足。

通过DbeaverEE连接Mongo,可以看到简单的存储结构如下:
1、Mongo中以文档的方式存储数据(Document),相当于Mysql中的一条数据、多个文档组成集合Collection,相当于Mysql中的表,多个Collection组成数据库,注意在Mongo中也可以给数据属性设置索引
在这里插入图片描述

2.、基本的CRUD操作在gitee源码中有操作以及分页、排序、范围查询等等,后续查询进阶练习待续…

基本操作示例:

@Service
public class BookMongoServiceImpl implements BookMongoService {

    @Autowired
    private MongoTemplate mongoTemplate;

    /**
     * 新增
     * @param bookDTO
     * @return
     */
    @Override
    public Boolean inserBookInfo(BookDTO bookDTO) {
        mongoTemplate.insert(bookDTO);
        return true;
    }

    /**
     * 批量新增
     * @param bookDTOList
     * @return
     */
    @Override
    public Boolean inserBatchBookInfo(List<BookDTO> bookDTOList) {
        mongoTemplate.insert(bookDTOList,BookDTO.class);
        return  true;
    }

    /**
     * 修改
     * @param query
     * @param update
     * @return
     */
    @Override
    public Boolean updateBookInfo(Query query, Update update) {
        mongoTemplate.updateMulti(query,update,BookDTO.class);
        return true;
    }

    /**
     * 查所有
     * @return
     */
    @Override
    public  List<BookDTO> findAllBookInfo() {
        List<BookDTO> bookDTOList = mongoTemplate.findAll(BookDTO.class);
        return bookDTOList;
    }

    /**
     * 根据书名查询: 精准
     * @param name
     * @return
     */
    @Override
    public List<BookDTO> findBookInfoByName(String name) {
        Query query = Query.query(Criteria.where("name").is(name));
        return mongoTemplate.find(query,BookDTO.class);
    }

    /**
     * 根据书名查询: 模糊
     * @param name
     * @return
     */
    @Override
    public List<BookDTO> findBookInfoReName(String name) {
        // ^.*表示字符前面、*$表示字符后面
        Pattern compile = Pattern.compile("^.*" + name + ".*$", Pattern.CASE_INSENSITIVE);
        Query query= Query.query(Criteria.where("name").regex(compile));
        return mongoTemplate.find(query,BookDTO.class);
    }

    /**
     * 根据阅读量:范围查询并排序
     * @param minReadedNum
     * @param maxReadedNum
     * @return
     */
    @Override
    public List<BookDTO> findBookInfoReRange(Double minReadedNum, Double maxReadedNum) {
        // query两种方式
        Query query = Query.query(Criteria.where("readedNum").gte(minReadedNum).lte(maxReadedNum))
                .with(new Sort(new Sort.Order(Sort.Direction.ASC,"readedNum")));
        return  mongoTemplate.find(query,BookDTO.class);
    }

    /**
     * 排序-分页查询
     * @param minReadedNum
     * @param maxReadedNum
     * @param pageNum
     * @param pageSize
     * @return
     */
    @Override
    public List<BookDTO> findBookInfoPage(Double minReadedNum, Double maxReadedNum, Integer pageNum, Integer pageSize) {
        Query query = Query.query(Criteria.where("readedNum").gte(minReadedNum).lte(maxReadedNum))
                .with(new Sort(new Sort.Order(Sort.Direction.ASC,"readedNum")))
                .with(new PageRequest(pageNum-1,pageSize));
        return mongoTemplate.find(query, BookDTO.class);
    }

}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值