MongoDB解析 1-理论基础

前言

官网:

Start with Guides — Start with Guides (mongodb.com)

MongoDB中文网

MongoDB 简介 | 菜鸟教程 (runoob.com)

 

 MongoDB是一个开源的NoSQL数据库管理程序。

 

MongoDB安装

(38条消息) MongoDB安装(超详细)_AI bro的博客-CSDN博客_mongodb安装

 

MongoDB集群高可用

MongoDB主从复制架构原理和缺陷

master-slave架构中master节点负责数据的读写,slave没有写入权限只负责读取数据。

主从结构没有自动故障转移功能,需要指定master和slave端,不推荐在生产中使用。
mongodb4.0后不再支持主从复制!
[main] Master/slave replication is no longer supported

复制集replica sets

复制集是由一组拥有相同数据集的mongod实例做组成的集群。
复制集是一个集群,它是2台及2台以上的服务器组成,以及复制集成员包括Primary主节点,secondary从节点和投票节点。
复制集提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性,保证数据的安全性。

分片集群 Shard Cluster

分片(sharding)是MongoDB用来将大型集合水平分割到不同服务器(或者复制集)上所采用的方法。 不需要功能强大的大型计算机就可以存储更多的数据,处理更大的负载。

MongoDB集群高可用 | 牧马人的忧伤 (lvxueyang.vip)

 

MongoDB安全认证

MongoDB 默认是没有账号的,可以直接连接,无须身份验证。实际项目中肯定是要权限验证的,否则 后果不堪设想。从2016年开始 发生了多起MongoDB黑客赎金事件,大部分MongoDB安全问题 暴露出 了安全问题的短板其实是用户,首先用户对于数据库的安全不重视,其次用户在使用过程中可能没有养 成定期备份的好习惯,最后是企业可能缺乏有经验和技术的专业人员。所以对MongoDB进行安全认证 是必须要做的。

MongoDB安全认证 | 牧马人的忧伤 (lvxueyang.vip)

 

MongoDB应用

NoSQL 和 MongoDB

NoSQL=Not Only SQL,支持类似SQL的功能, 与Relational Database相辅相成。其性能较高, 不使用SQL意味着没有结构化的存储要求(SQL为结构化的查询语句),没有约束之后架构更加灵 活。
NoSQL数据库四大家族列存储 Hbase,键值(Key-Value)存储 Redis,图像存储 Neo4j,文档存储 MongoDB
MongoDB 是一个基于分布式文件存储的数据库,由 C++ 编写,可以为 WEB 应用提供可扩展、 高性能、易部署的数据存储解决方案。
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库中功能最丰富、 最像关系数据库的。在高负载的情况下,通过添加更多的节点,可以保证服务器性能。

MongoDB应用 | 牧马人的忧伤 (lvxueyang.vip)

 

Spring 访问MongoDB

Spring Data MongoDB

Spring Data MongoDB - Reference Documentation

第1步:基于maven新建工程导入依赖的包

<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<version>2.0.9.RELEASE</version>  -- 注意 2.x 与 3.x 存在很大变化升级版本注意,初次使用建议使用比较靠近最新版本 
</dependency>

GitHub - spring-projects/spring-data-mongodb: Provide support to increase developer productivity in Java when using MongoDB. Uses familiar Spring concepts such as a template classes for core API usage and lightweight repository style data access.

 

 

第2步:在配置文件中配置 MongoTemplate

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mongo="http://www.springframework.org/schema/data/mongo"
       xsi:schemaLocation=" http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/data/mongo
        http://www.springframework.org/schema/data/mongo/spring-mongo.xsd">

    <mongo:db-factory id="mongoDbFactory" client-uri="mongodb://106.75.226.220:28017/lg_resume"/>

    <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
        <constructor-arg index="0" ref="mongoDbFactory"/>
    </bean>
    <context:component-scan base-package="org.example.mongodb"/>
</beans>

第3步:DAO 实现类注入 MongoTemplate 完成增删改查

package org.example.mongodb.bean;

import java.util.Date;

/**
 * @author :xjlonly
 * @date :Created in 2021/5/13 15:20
 * @description:
 * @modified By:
 * @version: $
 */
public class Resume {
    private int id;
    private String name;
    private double salary;
    private Date birthday;

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }

    @Override
    public String toString() {
        return "Resume{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", salary=" + salary +
                ", birthday=" + birthday +
                '}';
    }
}
package org.example.mongodb.dao.impl;

import org.example.mongodb.bean.Resume;
import org.example.mongodb.dao.ResumeDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.stereotype.Repository;

/**
 * @author :xjlonly
 * @date :Created in 2021/5/13 15:23
 * @description:
 * @modified By:
 * @version: $
 */
@Repository(value = "resumeDao")
public class ResumeDaoImpl implements ResumeDao {

    @Autowired
    private MongoTemplate  mongoTemplate;

    @Override
    public void insertResume(Resume resume) {
        //不指定collection时  默认为对象名首字母小写
        //mongoTemplate.insert(resume);
        //指定collection
        mongoTemplate.insert(resume,"lg_resume_datas");
    }
    
    @Override
    public List<Resume> findByResume(String name) {
        Query query = new Query();
        query.addCriteria(Criteria.where("name").is(name));
        return mongoTemplate.find(query,Resume.class, "lg_resume_datas");
    }
    
    @Override
    public List<Resume> findByNameAndSalary(String name, double salary) {
        Query query  =new Query();
        query.addCriteria(Criteria.where("name").is(name).andOperator(Criteria.where("salary").is(salary)));
        return mongoTemplate.find(query, Resume.class,"lg_resume_datas");

    }
}

第4步: 从Spring容器中获取DAO对象 进行测试 (注意:要开启组件扫描)

package org.example.mongodb;

import org.example.mongodb.bean.Resume;
import org.example.mongodb.dao.ResumeDao;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.format.datetime.DateFormatter;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * Hello world!
 *
 */
public class App 
{
    public static void main( String[] args )
    {
        ClassPathXmlApplicationContext pathXmlApplicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        final ResumeDao resumeDao = pathXmlApplicationContext.getBean("resumeDao", ResumeDao.class);
        Resume resume = new Resume();
        resume.setName("zhangsan");
        resume.setSalary(895555);
        //日期格式
        Date date = null;
        SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        try {
            date =  dateFormatter.parse("2001-2-12 13:12:23");
        } catch (ParseException e) {
            e.printStackTrace();
        }
        resume.setBirthday(date);
        resumeDao.insertResume(resume);
        System.out.println( "Hello World!" );
    }
}

MongoDB应用 | 牧马人的忧伤 (lvxueyang.vip)

 

MongoDB架构

MongoDB 与 MySQL 中的架构相差不多,底层都使用了可插拔的存储引擎以满足用户的不同需要。用户可以根据程序的数据特征选择不同的存储引擎,在最新版本的 MongoDB 中使用了 WiredTiger 作为默 认的存储引擎,WiredTiger 提供了不同粒度的并发控制和压缩机制,能够为不同种类的应用提供了最 好的性能和存储率。

在存储引擎上层的就是 MongoDB 的数据模型和查询语言了,由于 MongoDB 对数据的存储与 RDBMS有较大的差异,所以它创建了一套不同的数据模型和查询语言。

MongoDB架构 | 牧马人的忧伤 (lvxueyang.vip)

 

其他参考学习:

MongoDB和Java(4):Spring Data整合MongoDB(XML配置) - 用户不存在! - 博客园 (cnblogs.com)

(38条消息) spring 5.x 系列第9篇 —— 整合mongodb (xml配置方式)_hei bai ying的博客-CSDN博客_mongo spring xml

(39条消息) Spring Data MongoDB 爆出 SpEL 表达式注入漏洞_墨菲安全的博客-CSDN博客_mongodb注入漏洞

(39条消息) Spring Data MongoDB 曝出 SpEL 表达式注入漏洞,OSCS开源社区建议开发者进行修复_开源生态安全OSCS的博客-CSDN博客

 

posted @ 2022-06-27 22:47  chch213  阅读(83)  评论(0编辑  收藏  举报