MongoDB介绍及使用教程
创始人
2024-05-26 09:04:24
0

文章目录

    • 一、MongoDB介绍
    • 1. 什么是MongoDB
    • 2. 为什么要用MongoDB
    • 3. MongoDB的应用场景
    • 4. MongoDB基本概念
    • 二、MongoDB使用教程
    • 1.下载安装(Windows)
    • 2.MongoDB Conpass简单使用(选学)
    • 3.使用navicat连接MongoDB
    • 4.JAVA项目中使用MongoDB
    • (1)开启用户名密码验证
    • (2)整合SpringBoot项目

一、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
存在: exists基于类型查询: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包

org.springframework.bootspring-boot-starter-data-mongodb3.0.2

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 {@Idprivate 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 {}

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")@ResponseBodypublic String test() {return "test111";}@Autowiredprivate final UserRepository userRepository;public UserController(UserRepository userRepository) {this.userRepository = userRepository;}@PostMapping("/addUser")@ResponseBodypublic String addNewUser(@RequestBody User user) {userRepository.save(user);return "添加成功!";}@GetMapping("/getUserList")@ResponseBodypublic String getUserList() {List userList = userRepository.findAll();userList.forEach(user -> System.out.println(user.toString()));return "";}}

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

相关内容

热门资讯

读什么什么有感的英文 读什么什么有感的英文英语读后感标题 “读XXX有感”用英语说是 “Reading after XX...
秦岚个人资料身高体重 秦岚个人资料身高体重身高:165公分 体重:46公斤秦岚 生日:七月十七日 星座:巨蟹座 出生地:沈...
双鱼和天秤会纠缠一辈子,既相配... 双鱼和天秤会纠缠一辈子,既相配又相克,为什么?双鱼座的人和天秤座的人都是比较细心的,而且特别敏感,有...
独自一人在外怎样和别人相处? 独自一人在外怎样和别人相处?我觉得独自一个人在外面一定要好好的照顾自己,应该找一份工作,找一个住的地...
朱自清散文集有哪些写的好,值得... 朱自清散文集有哪些写的好,值得背诵的?《背影》、《 春》、《 荷塘月色》、《 匆匆》都是不错的佳...
大家最讨厌的电视剧的哪一个主角... 大家最讨厌的电视剧的哪一个主角?我觉得最讨厌的电视剧主角是容嬷嬷。都挺好,里面的苏大强就是越看越别扭...
69DT伤害怎么才能上1300... 69DT伤害怎么才能上1300 !我加点是4L1M!现在60了!伤害才800!我没大号,想买梦幻币买...
孩子上课不认真听讲 孩子上课不认真听讲我的孩子七周半,已经上二年级了,但是上课不认真听讲总是搞小动作,说了很多次也不听,...
《红脸儿》的主要内容 《红脸儿》的主要内容  红脸儿主要内容:   小说以散淡而富有诗意的语言回顾了“我”与3个小伙伴之间...
异地恋的成功例子 异地恋的成功例子 情侣异地恋8年终成正果 两人存下186张火车票见证爱情一对河南的情侣在大学恋爱时便...
小狗吃了死耗子怎么办 小狗吃了死耗子怎么办你好,没事的,放心吧,你的小狗是宠物狗还是土狗,若是宠物狗的话可能会给它造成身体...
请问有没有死亡万花筒广播剧资源... 请问有没有死亡万花筒广播剧资源?死亡万花筒,我有呀!死亡万花筒广播剧,地·址:9525.video(...
徐缺有哪些女人 徐缺有哪些女人徐缺是小说《最强反套路系统》中的角色,他有许多女性关系,其中包括:1. 林小红:徐缺的...
假如我是四大名著中的人物作文9... 假如我是四大名著中的人物作文900假如你是的林黛玉的话那你就会好好读书,不至于连900个字都写不出了...
西游记81难? 西游记81难?西游记的81难是师徒四人取经回来在河中落水经书被淹了的事
魔兽世界风暴王子问题! 魔兽世界风暴王子问题!现在3.05这版本 王子第4阶段的屏障 是不是可以被MS驱散? 屏障驱散后是...
如何评价张杰的少年中国说 如何评价张杰的少年中国说我觉得非常棒,张杰的家庭条件不好。从小就非常努力。刻苦学习音乐,经过拼搏奋斗...
智取生辰纲中杨志是怎样的人?他... 智取生辰纲中杨志是怎样的人?他失败的原因是什么?简短些志有智慧,但是他忽略了一个重要的因素:团队的合...
有一本书,名字忘记了.好象是美... 有一本书,名字忘记了.好象是美国人写的.梭罗《瓦尔登湖》 如果你用的是新教材,应该是这篇吧是 海明威...
四岁孩子看什么书 四岁孩子看什么书可以看一些带有简单数字的书、色彩鲜艳的图画、动物图画等,培养他的数字感和色彩感,尽量...