MongoDB快速入门小杂记
前因
起因是一台MongoDB虚拟机磁盘95%了,联系系统技术负责人安排删除数据,因数据为生产数据,如果运维的我私下删除会坐牢
,我也不想走OA,于是直接反馈到技术负责人
和我们这边的DB管理员。可能都不想闯这浑水也顺便给讽刺了一波,那我就顺便再复习一下吧。就当这个笔记做个起因我去复习了。
mongodb是什么
MongoDB是一个NoSQL的非关系型数据库 ,支持海量数据存储,高性能的读写。
基本概念
数据库(Database)
是集合的容器,相当于关系型DB(SQL)中的数据库。
集合(Collection)
数据库中的⼀组⽂档,相当于SQL中的表。
⽂档(Document)
集合中的⼀条记录,相当于SQL的表中的⼀⾏。不同的⽂档之间不必有相同的结构,这⼀点是和SQL不同的。
字段(Field)
⽂档中的键值对,相当于SQL中的列。⽐较重要的区别是MongoDB中的⼀个field可以是⼀个JSON对象或者数组。
mongo的体系结构
SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 表连接,MongoDB不支持 | |
primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
mongoDB存储原理
- mongoDb采用内存加磁盘的方式存储数据
- mongoDb支持数据分片,当单一的服务器中磁盘不够用的时候,还可以串联其他服务器;
- 客户端的请求到达内存时,先在日志中记录下操作记录,然后再去操作内存;
- 内存中的日志每10ms向磁盘中的日志进行同步一次,数据则每分钟同步一次;
- 客户端先去内存中查询数据,内存中没有再去查询磁盘;
- 当客户端写入的时候,会先写入到内存中,内存中写入后请求直接返回,内存中的数据会根据同步策略同步到磁盘;
- 如果机器宕机,在重启服务的时候会解析磁盘中的日志和磁盘中的数据进行对比,将未入到磁盘中的数据写入磁盘,但可能会丢失10ms的数据;
使用docker快速部署mongo
安装
拉取mongo镜像:
docker pull mongo:4.4
创建mongo数据持久化目录
mkdir -p /data/docker/mongodb/data
运行容器
docker run -itd --name mongo -v /data/docker/mongodb/data:/data/db -p 27017:27017 mongo:4.4 --auth
–auth:需要密码才能访问容器服务
创建用户
以 admin用户身份进入mongo
docker exec -it mongodb mongo admin
创建一个用户,mongo 默认没有用户
db.createUser({ user:'root',pwd:'123456',roles:[ { role:'userAdminAnyDatabase', db: 'admin'},'readWriteAnyDatabase']});
db.auth('root','123456') # 尝试使用上面创建的用户信息进行连接。
exit # 创建成功后可退出
简单测试
[root@localhost ~]# docker exec -it mongo /bin/bash
root@f6be943a9361:/#
root@f6be943a9361:/# mongo admin -u root -p
MongoDB shell version v4.4.25
Enter password:
connecting to: mongodb://127.0.0.1:27017/admin?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("60c3d561-71ce-442c-83e5-5b4b22550789") }
MongoDB server version: 4.4.25
>
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
test 0.000GB
>
使用mongodb
常用命令
#查看已经存在的数据库
show dbs;
#创建数据库
use 数据库名
#删除数据库
db.dropDatabase()
#查看集合
show collections;
#创建集合
db.createCollection("news")
#删除集合
db.runoob.drop()
#添加数据
db.集合名.insert({'id':1,'title':'12'})
#查询所有
db.集合名.find()
#删除数据
db.集合名.remove({"id":1})
#条件查询
db.集合名.find({"id":1})
基本命令
# 打开⼀个连接到本地实例的MongoShell 所有其他命令都需要再mongosh中执⾏。
mongosh
# 显示当前MongoDB实例中的所有数据库。
show databases
show dbs
# 显示当前使⽤中的数据库名称。
db
# 清屏。
cls
# 显示当前数据库中的所有集合
show collections
# 删除当前的数据库。
db.dropDatabase()
# 退出mongosh会话。
exit
创建/插⼊
insertOne # 在集合中插⼊⼀个新的⽂档。如:db.users.insertOne({name: "glj"})
insertMany # 集合中插⼊多个新的⽂档。db.users.insertMany([{name: "李四"}, {name: "王五"}])
查找
# 查询所有的⽂档。
find
#如:db.users.find()
# 查询所有满⾜参数对象<filterObject>中指定过滤条件的数据
find(<filterObject>)
#如:db.users.find({name: "glj"})
# 查询所有满⾜参数对象<filterObject>中指定过滤条件的数据,并且只返回<selectObject>中指定的字段。
db.find(<filterObject>,<selectObject>)
#如 db.users.find({name: "glj"}, {name: 1, email: 1})
# 与find⽤法相同,找到满⾜过滤条件的对象,但是只返回第⼀条。
findOne
# 如: db.users.findOne({level: 1})
sort # 使⽤给定的字段按照升序或者降序来排序。
limit #限定只返回给定数量的⽂档。
skip #从头开始跳过给定数值的⽂档。
更新
# 更新满⾜条件的第⼀个⽂档。
updateOne
# 更新满⾜条件的所有⽂档。
updateMany
# 替换满⾜条件的第⼀个⽂档。
replaceOne
# 通过传⼊的⽂档替换已有⽂档或插⼊⼀个新的⽂档。
save
# 只更新⽂档中$set指定的字段,不会影响其他字段。
$set
# ⽤于递增(或递减)⽂档中指定字段值的操作符。
$inc
# 更新某个字段的名称。
$rename
# 删除⼀个字段。
$unset
# 将值加⼊⼀个数组中,不会判断是否有重复的值。
$push
#将值从⼀个数组中移除。
$pull
# 将值加⼊⼀个数组中,会判断是否有重复的值,若重复则不加⼊。
$addToSet
删除
# 删除满⾜条件的第⼀个⽂档。
deleteOne
#删除满⾜条件的所有⽂档。
deleteMany
聚合
聚合主要⽤于处理数据,并返回计算后的结果,⽐如求和、平均值等。
$sum #计算总和。
$avg # 计算平均值。
$min #获取最⼩值。
$max #获取最⼤值。
$push #将值加⼊⼀个数组中,不会判断是否有重复的值。
$first #获取第⼀个⽂档数据。
$last #获取最后⼀个⽂档数据。
参考
快速引起记忆视频:https://www.bilibili.com/video/BV16u4y1y7Fm
文章:https://blog.csdn.net/ManGooo0/article/details/123803323