MongoDB介绍及使用教程

一、MongoDB介绍

1. 什么是MongoDB

MongoDB是一个文档数据库,由C++语言编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB目前在数据库总排名第5,在NoSQL数据库排名首位,是当前最流行的数据库之一。
注意:这里所指文档并非我们一般理解的 PDF,WORD 文档,而是来自于“JSON Document”,以 JSON 为数据模型。

官方介绍详见:MongoDB官网

2. 为什么要用MongoDB

(1)数据结构非常松散,数据格式是BSON(Binary JSON) ,其结构是面向对象的而不是二维表,因此可以存储比较复杂的数据类型。
①数据模型与对象模型接近,开发代码量低 ②这样的数据模型有利于提供高读写的能力,增强吞吐量。
③数据模型因为是面向对象的,所以可以表示丰富的、有层级的数据结构,比如能把“评论”直接怼到“文章“的文档中,而不必创建三张表来描述这样的关系
(2)支持对数据建立索引,及时查询能力强。原则上 Oracle 和MySQL 能做的事情,MongoDB 都能做(包括 ACID 事务)。
(3)易伸缩,提供了分片能力,能对数据集进行分片,数据的存储压力分摊给多台服务器
(4)自动故障转移,MongoDB自身提供了副本集,能检测主节点是否存活,当失活时能自动提升从节点为主节点,达到故障转移。
(5)数据恢复功能,MongoDB提供了Journaling日志的概念,类似mysql的bin-log日志,插入的时候先往日志里写入记录,再完成实际的数据操作,如果出现宕机可以读取Journaling日志进行修复。
(6)支持多种语言,包括RUBY,PYTHON,JAVA,C++,PHP等

3. MongoDB的应用场景

(1)MongoDB可以解决传统数据库不好解决的三高问题 High performance - 对数据库高并发读写的需求 Huge
Storage - 对海量数据的高效率存储和访问的需求 High Scalability && High Availability-
对数据库的高可扩展性和高可用性的需求 (2)MongoDB应用场景特点 数据量大; 读写操作频繁; 不需要复杂的事务和join操作;
数据价值较低,对事务要求不高 (3)常见实际应用场景 ①游戏场景
使用MongoDB存储游戏用户信息、装备、积分等,直接以内嵌文档的形式存储,方便查询、更新。 ②物流场景
使用MongoDB存储订单信息、订单状态、物流信息,订单状态在运送过程中飞速迭代、以MongoDB内嵌数组的形式来存储,一次查询就能将订单所有的变更查出来。
③社交场景 使用MongoDB存储用户信息,朋友圈信息,通过地理位置索引实现附近的人、定位功能。 ④物联网场景
使用MongoDB存储设备信息、设备汇报的日志信息、并对这些信息进行多维度分析。 ⑤视频直播 使用MongoDB存储用户信息、点赞互动信息。
⑥大数据应用 使用云数据库MongoDB作为大数据的云存储系统,随时进行数据提取分析,掌握行业动态。

4. MongoDB基本概念

(1)与关系型数据库(RDBMS)类比:

MongoDB概念 RDBMS概念
数据库 数据库
集合
文档
字段
索引 索引
id 主键
视图 视图
聚合操作 表连接

(2)基本概念介绍

数据库(database):最外层的概念,可以理解为逻辑上的名称空间,一个数据库包含多个不同名称的集合。
集合(collection):相当于SQL中的表,一个集合可以存放多个不同的文档。
文档(document):一个文档相当于数据表中的一行,由多个不同的字段组成。
字段(field):文档中的一个属性,等同于列(column)。 索引(index):独立的检索式数据结构,与SQL概念一致。
id:每个文档中都拥有一个唯一的id字段,相当于SQL中的主键(primary key)。
视图(view):可以看作一种虚拟的(非真实存在的)集合,与SQL中的视图类似。从MongoDB3.4版本开始提供了视图功能,其通过聚合管道技术实现。
聚合操作(lookup):MongoDB用于实现“类似”表连接(tablejoin)的聚合操作符。

二、MongoDB使用教程

1.下载安装(Windows)

进入下载地址,选择windows版本的进行下载即可。我这里下载的是6.0.4版本。
下载完成直接下一步下一步安装即可,最好不要修改安装位置,会默认装上可视化工具MongoDB Conpass。
控制台输入services.msc,查看MongoDB的服务,正常启动则安装成功。

在这里插入图片描述

2.MongoDB Conpass简单使用(选学)

(1)连接数据库
默认端口27017
在这里插入图片描述
(2)新建数据库Database和集合Collection
这里的集合相当于传统数据库的表名
在这里插入图片描述
(3)添加数据
我这里随便找了个json的数据,补充在_id后面,注意不要漏了逗号,否则会提示格式不对
在这里插入图片描述
(4)导出数据
在这里插入图片描述
可以导出json或者csv格式的数据,output那里需要指定一个文件进行导出
在这里插入图片描述
(5)添加索引
选择索引时会提示有哪些字段可以选
在这里插入图片描述
索引类型可以选择升序asc,降序desc,地理空间索引2dsphere,全文索引text
在这里插入图片描述
(6)其他功能
在这里插入图片描述

[Aggregation]选项卡即是聚合函数信息区,用于实现“类似”表连接操作;
[Schema]选项卡即是模式信息区,点击分析按钮可以看到当前集合(表)的执行信息,如表数据导入时间,表的具体字段、长度等信息;
[Explain Plan]选项卡即是执行计划信息区,可评估查询性能; [Validation]
选项卡可以用于验证数据,可以添加规则验证数据质量

注:增删改查语法参照下面navicat

3.使用navicat连接MongoDB

(1)连接数据库
新建连接时选择数据库类型为MongoDB即可,默认端口27017
在这里插入图片描述

在这里插入图片描述
(2)增删改查
右键新建查询进入命令行页面
在这里插入图片描述

Ⅰ、新增
1)语法:
db. 集合名 .insert( 文档 ) : 往集合中插入一个文档
db. 集合名 .find(): 查询集合中所有文档
db.users.insertMany:批量插入

2)示例:
①插入一个用户对象

db.user.insert({
    name: "刘备",
    age:"24"
})

当没有设置id时,mangoDB会自动生成一个id。
往集合中新增文档,当集合不存在时会自动先创建集合,再往集合中添加文档。
在这里插入图片描述

②插入一个用户对象(设置id,设置数据类型)

db.user.insert({id: NumberLong(1), name: "赵日地", age: NumberInt(18)})

③批量插入

db.users.insertMany(
  [
     {
       _id: 1,
       name: "sue",
       age: 19,
       type: 1,
       status: "P",
       favorites: { artist: "Picasso", food: "pizza" },
       finished: [ 17, 3 ],
       badges: [ "blue", "black" ],
       points: [
          { points: 85, bonus: 20 },
          { points: 85, bonus: 10 }
       ]
     },
     {
       _id: 2,
       name: "bob",
       age: 42,
       type: 1,
       status: "A",
       favorites: { artist: "Miro", food: "meringue" },
       finished: [ 11, 25 ],
       badges: [ "green" ],
       points: [
          { points: 85, bonus: 20 },
          { points: 64, bonus: 12 }
       ]
     },
     {
       _id: 3,
       name: "ahn",
       age: 22,
       type: 2,
       status: "A",
       favorites: { artist: "Cassatt", food: "cake" },
       finished: [ 6 ],
       badges: [ "blue", "red" ],
       points: [
          { points: 81, bonus: 8 },
          { points: 55, bonus: 20 }
       ]
     },
     {
       _id: 4,
       name: "xi",
       age: 34,
       type: 2,
       status: "D",
       favorites: { artist: "Chagall", food: "chocolate" },
       finished: [ 5, 11 ],
       badges: [ "red", "black" ],
       points: [
          { points: 53, bonus: 15 },
          { points: 51, bonus: 15 }
       ]
     },
     {
       _id: 5,
       name: "xyz",
       age: 23,
       type: 2,
       status: "D",
       favorites: { artist: "Noguchi", food: "nougat" },
       finished: [ 14, 6 ],
       badges: [ "orange" ],
       points: [
          { points: 71, bonus: 20 }
       ]
     },
     {
       _id: 6,
       name: "abc",
       age: 43,
       type: 1,
       status: "A",
       favorites: { food: "pizza", artist: "Picasso" },
       finished: [ 18, 12 ],
       badges: [ "black", "blue" ],
       points: [
          { points: 78, bonus: 8 },
          { points: 57, bonus: 7 }
       ]
     }
  ]
)

Ⅱ、删除
1)语法
删除 1 个,若有多个则删除第一个: db. 集合名 .deleteOne( … )
删除所有: db. 集合名 .deleteMany( … )

2)示例
①删除第一个 status=A的文档

db.users.deleteOne({ status: "A" })

②删除所有带有 name=abc 的文档

db.users.deleteMany({ name : "abc" })

③删除当前数据库中所有文档

db.users.deleteMany({})

Ⅲ、更新

1)语法:
更新1个:db.集合名.updateOne( … )
更新所有:db.集合名.updateMany( … )

2)示例:
①把一个带有 name=xyz 的文档,修改其 age 值为 30

db.users.updateOne({name: "xyz"}, {$set: {age: 30}})

②修改所有 name=xyz的文档,修改其name=“zyx” , age=20

db.users.updateMany({name: "xyz"} ,{$set: {name: "zyx", age: 20}})

Ⅳ、普通查询
1)语法
db. 集合名 .find(query , projection)

2)示例
①查询所有文档
db.users.find()

Ⅴ、高级查询
1)等值
语法 -> find({ 字段 : 值 })

2)比较查询
语法 -> find({ 字段 : { 比较操作符 : 值, …}})
如:db.users.find({age:{$gt:20}})

比较操作符:
(>) 大于 - $gt
(<) 小于 - $lt
(>=) 大于等于 - $gte
(<= ) 小于等于 - $lte
(!=) 不等 - $ne
集合运算 - KaTeX parse error: Expected '}', got 'EOF' at end of input: in 如:`{name: { in: [“xiaoyao”,“bunny”]}} 判断存在 - $exists 如:{name: {$exists:true}}`

3)逻辑查询
语法 -> find({逻辑操作符: [条件1, 条件2, …]})

逻辑操作符:
(&&) 与 - $and
(||) 或 - $or
(!) 非 - $not
包含但不包含: $nor
存在: e x i s t s 基于类型查询: exists 基于类型查询: exists基于类型查询:type
如:db.users.find({$and:[{age:{$gt:20}},{status:"A"}]})

4)模糊查询
MongoDB的模糊查询使用的是正则表达式的语法 如:{name: {$regex: /^.*keyword.*$/}}

4.JAVA项目中使用MongoDB

(1)开启用户名密码验证

Ⅰ.mongodb6.0后无默认shell工具(之前的版本是mongo.exe),需要下载,下载后将mongosh.exe、mongosh_crypt_v1.dll放入bin目录下 。下载地址
Ⅱ.打开mongosh.exe,按enter即可进入。
在这里插入图片描述
Ⅲ.执行下面命令
切换数据库:

use admin

创建用户,这里root是角色名

db.createUser({
    
    
  user: 'admin',  // 用户名
  pwd: '123456',  // 密码
  roles:[{
    
    
    role: 'root',  // 角色
    db: 'admin'  // 数据库
  }]
})

如果需要在admin数据库以外的数据库新建数据库test,可以给角色赋读写权限

db.grantRolesToUser("admin",[{
    
     role: "readWrite", db: "test" }])

查看角色是否创建成功:

show users

下一次创建角色需要登录赋权

db.auth("admin","123456");

Ⅳ.修改配置文件
默认安装目录:C:\Program Files\MongoDB\Server\6.0\bin\mongod.cfg
找到#security: 处,添加

security: 
  authorization: enabled

Ⅴ.重新启动,再试试不需要用户密码登录连接mongo,失败。再试试下面的连接是否成功。

在这里插入图片描述

Ⅵ.连接成功后可以在查看中显示隐藏的项目,否则admin的数据库是默认隐藏的。
在这里插入图片描述

(2)整合SpringBoot项目

添加maven包

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

application.yml配置

spring:
  data:
    mongodb:
      uri: mongodb://admin:123456@localhost:27017/admin

新建User类

package com.example.user.domain;

import lombok.AllArgsConstructor;
import lombok.Data;
import org.springframework.data.annotation.Id;

import java.util.Date;

@Data
@AllArgsConstructor
public class User {
    
    

    @Id
    private String userId;

    private String name;

    private Integer age;

    private Date createTime = new Date();


}

UserRepository.java:
注意这里泛型的User对应的Collections(表),String代表主键类型。通过Web应用新增时会自动创建表。

package com.example.user.dal;

import com.example.user.domain.User;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface UserRepository extends MongoRepository<User, String> {
    
    


}

UserController.java:

package com.example.user.controller;

import com.example.user.dal.UserRepository;
import com.example.user.domain.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Controller
public class UserController {
    
    




    @RequestMapping(value = "/test")
    @ResponseBody
    public String test() {
    
    
        return "test111";
    }


    @Autowired
    private final UserRepository userRepository;

    public UserController(UserRepository userRepository) {
    
    
        this.userRepository = userRepository;
    }

    @PostMapping("/addUser")
    @ResponseBody
    public String addNewUser(@RequestBody User user) {
    
    
        userRepository.save(user);
        return "添加成功!";
    }


    @GetMapping("/getUserList")
    @ResponseBody
    public String getUserList() {
    
    
        List<User> userList = userRepository.findAll();
        userList.forEach(user -> System.out.println(user.toString()));
        return "";
    }



}

测试流程如下:
http://localhost:8030/addUser
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/tttalk/article/details/128844944