MongoDB

什么是MongoDB ?

MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。

在高负载的情况下,添加更多的节点,可以保证服务器性能。

MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。

MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。


主要特点

  • MongoDB 是一个面向文档存储的数据库,操作起来比较简单和容易。
  • 你可以在MongoDB记录中设置任何属性的索引 (如:FirstName="Sameer",Address="8 Gandhi Road")来实现更快的排序。
  • 你可以通过本地或者网络创建数据镜像,这使得MongoDB有更强的扩展性。
  • 如果负载的增加(需要更多的存储空间和更强的处理能力) ,它可以分布在计算机网络中的其他节点上这就是所谓的分片。
  • Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
  • MongoDb 使用update()命令可以实现替换完成的文档(数据)或者一些指定的数据字段 。
  • Mongodb中的Map/reduce主要是用来对数据进行批量处理和聚合操作。
  • Map和Reduce。Map函数调用emit(key,value)遍历集合中所有的记录,将key与value传给Reduce函数进行处理。
  • Map函数和Reduce函数是使用Javascript编写的,并可以通过db.runCommand或mapreduce命令来执行MapReduce操作。
  • GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件。
  • MongoDB允许在服务端执行脚本,可以用Javascript编写某个函数,直接在服务端执行,也可以把函数的定义存储在服务端,下次直接调用即可。
  • MongoDB支持各种编程语言:RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言。
  • MongoDB安装简单。

Docker 安装 MongoDB

MongoDB 是一个免费的开源跨平台面向文档的 NoSQL 数据库程序。

1、查看可用的 MongoDB 版本

访问 MongoDB 镜像库地址: https://hub.docker.com/_/mongo?tab=tags&page=1

可以通过 Sort by 查看其他版本的 MongoDB,默认是最新版本 mongo:latest

你也可以在下拉列表中找到其他你想要的版本:

此外,我们还可以用 docker search mongo 命令来查看可用版本:

$ docker search mongo
NAME                              DESCRIPTION                      STARS     OFFICIAL   AUTOMATED
mongo                             MongoDB document databases ...   1989      [OK]       
mongo-express                     Web-based MongoDB admin int...   22        [OK]       
mvertes/alpine-mongo              light MongoDB container          19                   [OK]
mongooseim/mongooseim-docker      MongooseIM server the lates...   9                    [OK]
torusware/speedus-mongo           Always updated official Mon...   9                    [OK]
jacksoncage/mongo                 Instant MongoDB sharded cluster  6                    [OK]
mongoclient/mongoclient           Official docker image for M...   4                    [OK]
jadsonlourenco/mongo-rocks        Percona Mongodb with Rocksd...   4                    [OK]
asteris/apache-php-mongo          Apache2.4 + PHP + Mongo + m...   2                    [OK]
19hz/mongo-container              Mongodb replicaset for coreos    1                    [OK]
nitra/mongo                       Mongo3 centos7                   1                    [OK]
ackee/mongo                       MongoDB with fixed Bluemix p...  1                    [OK]
kobotoolbox/mongo                 https://github.com/kobotoolb...  1                    [OK]
valtlfelipe/mongo                 Docker Image based on the la...  1                    [OK]

2、取最新版的 MongoDB 镜像

这里我们拉取官方的最新版本的镜像:

$ docker pull mongo:latest

3、查看本地镜像

使用以下命令来查看是否已安装了 mongo:

$ docker images

在上图中可以看到我们已经安装了最新版本(latest)的 mongo 镜像。

4、运行容器

安装完成后,我们可以使用以下命令来运行 mongo 容器:

$ docker run -itd --name mongo -p 27017:27017 mongo --auth

参数说明:

  • -p 27017:27017 :映射容器服务的 27017 端口到宿主机的 27017 端口。外部可以直接通过 宿主机 ip:27017 访问到 mongo 的服务。
  • --auth:需要密码才能访问容器服务。

5、安装成功

最后我们可以通过 docker ps 命令查看容器的运行信息:

接着使用以下命令添加用户和设置密码,并且尝试连接。

$ docker exec -it mongo mongo admin
# 创建一个名为 admin,密码为 123456 的用户。
>  db.createUser({ user:'admin',pwd:'123456',roles:[ { role:'userAdminAnyDatabase', db: 'admin'},"readWriteAnyDatabase"]});
# 尝试使用上面创建的用户信息进行连接。
> db.auth('admin', '123456')

MongoDB 6.0 及以上版本使用以下命令:

docker exec -it mongo mongosh admin

SpringBoot整合MongoDB

一、添加MongoDB依赖

Spring Data MongDB 是Spring Data的下的一个模块,在SpringBoot中整合MongoDB就需要添加Spring Data MongDB的依赖

添加Spring Data MongDB依赖的方式有两种:

第一种:创建SrpingBoot项目时勾选Spring Data MongoDB

第二种:在pom.xml文件中添加Spring Data MongoDB依赖

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

二、配置文件

SpringBoot默认的配置文件格式是application.properties,而目前我们比较常用的SpringBoot配置文件格式为yml,所以这里我把配置文件的后缀改为.yml

application.yml文件中添加MongoDB的连接参数

spring:
  data:
    mongodb:
      host: 127.0.0.1 #指定MongoDB服务地址
      port: 27017 #指定端口,默认就为27017
      database: article#指定使用的数据库(集合)
      authentication-database: admin # 登录认证的逻辑库名
      username: admin #用户名
      password: abc123456 #密码

mongodb数据库与mysql不一样 mysql 一个普通用户可以管理多个数据库,但是mongo每一个库都有一个独立的管理用户,连接时需要输入对应用户密码

三、准备实体类

主要注解:

1. @Document,文档是 MongoDB 中最基本的数据单元,由键值对组成,类似于 JSON 格式,可以存储不同字段,字段的值可以包括其他文档,数组和文档数组。

2. @Id(主键):用来将成员变量的值映射为文档的_id的值

3. @Indexed(索引): 索引是一种特殊的数据结构,存储在一个易于遍历读取的数据集合中,能够对数据库文档中的数据进行排序。索引能极大提高文档查询效率,如果没有设置索引,MongoDB 会遍历集合中的整个文档,选取符合查询条件的文档记录。这种查询效率是非常低的。

4. @Field(字段): 文档中的字段,类似于 MySql 中的列。

5. @Aggregation(聚合): 聚合主要用于数据处理,例如统计平均值、求和等。

/**
 * 文章实体类
 **/

@Data
@Document(collection = "article") //指定要对应的文档名(表名)
@Accessors(chain = true)
public class Article {
    @Id
    private String id;//文章主键

    private String articleName; //文章名

    private String content; //文章内容
}


四、实现添加、删除、查询

SpringBoot操作MongoDB有两种方式,分别是继承MongoRepository类和service注入MongoTemplate

第一种:dao层继承MongoRepository

Repository是用于操作数据库的类

/**
 * 继承 MongoRepository<实体类,主键类型>,以实现CRUD
 **/

public interface ArticleRepository extends MongoRepository<Article,String> {
	//根据id查询文章
    List<Article> findByid(String id);
}

这里有一个坑,在创建查询方法时,方法名写的是findByArticleId,运行时报了一个No property articleid found for type Article!的错误,这里是因为创建自定义接口时需要遵守MongoRepository的命名规范,这里我们是根据文章id进行查询,而文章的主键名为id,所以这里接口需要起名findBy + 主键名,否则会报找不到属性的错误。

创建ArticleService.java接口定义操作方法

public interface ArticleService {

    /**
     * 添加文章
     * @param article
     * @return
     */
    int create(Article article);

    /**
     * 删除文章
     */

    int delete(List<String> ids);

    /**
     * 根据id查询
     * @param id
     * @return
     */
    List<Article> list(String id);
}

 创建实现类实现ArticleService.java接口

/**
 * ArticleService实现类
 **/
@Service
public class ArticleServiceImpl implements ArticleService {

    @Autowired
    private ArticleRepository articleRepository;

    /**
     * 添加文章
     *
     * @param article
     * @return
     */
    @Override
    public int create(Article article) {
        Article save = articleRepository.save(article);
        return 1;
    }

    /**
     * 删除文章
     *
     * @param ids
     */
    @Override
    public int delete(List<String> ids) {
        List<Article> deleteList = new ArrayList<>();

        for(String id:ids){
            Article article = new Article();
            article.setId(id);
            deleteList.add(article);
        }
        articleRepository.deleteAll(deleteList);

        return ids.size();
    }

    /**
     * 查询文章
     * @param id
     * @return
     */
    @Override
    public List<Article> list(String id) {
        return articleRepository.findByid(id);
    }
}

创建ArticleController.java控制器

/**
 * Web层,实现操作MongoDB
 **/
@RestController
@RequestMapping("/article")
@Api(tags = "文章操作")
public class ArticleController {

    @Autowired
    private ArticleService articleService;

    @PostMapping("/create")
    @ApiOperation("创建文章")
    public String create(@RequestBody Article article) {
        int result = articleService.create(article);
        if (result > 0) {
            return "文章创建成功";
        } else {
            return "文章创建失败";
        }
    }

    @PostMapping("/delete")
    @ApiOperation("批量删除文章")
    public String delete(@RequestParam("ids") List<String> ids) {
        int count = articleService.delete(ids);
        if (count > 0) {
            return "删除了" + count + "篇文章";
        } else {
            return "删除文章失败";
        }
    }

    @PostMapping("/list")
    @ApiOperation("查询")
    public List<Article> list(String id) {
        List<Article> list = articleService.list(id);
        return list;
    }

}

在地址栏输入http://localhost:8080/doc.html进入接口文档进行测试

 1)创建文章

创建成功

2)删除文章

成功删除

3)查询文章

查询成功

第二种:service层注入MongoTemplate 

package com.ukir.mongo.service.impl;

import com.ukir.mongo.pojo.Article;
import com.ukir.mongo.service.ArticleService2;
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.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
 * ArticleService实现类
 **/
@Service
public class ArticleServiceImpl2 implements ArticleService2 {


    @Autowired
    private MongoTemplate mongoTemplate;

    /**
     * 添加文章
     *
     * @param article
     * @return
     */
    @Override
    public int create(Article article) {
        Article save = mongoTemplate.save(article);
        return 1;
    }

    /**
     * 删除文章
     *
     * @param ids
     */
    @Override
    public int delete(String id) {
        List<Article> deleteList = new ArrayList<>();
        Query query = new Query();
        query.addCriteria(Criteria.where("id").is(id));
        mongoTemplate.remove(query,Article.class);
        return 1;
    }

    @Override
    public Article get(String id) {
        Article byId = mongoTemplate.findById(id, Article.class);
        return byId;
    }
}

测试效果和第一种方式一样

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值