NoSQL篇-MongDB数据库
1.MongDB的简介:
- MongoDB是一个开源、高性能、无模式的文档型数据库
- 当初的设计就是用于简化开发和方便扩展,是NoSQL数据库产品中的一种。是最像关系型数据库(MySQL)的非关系型数据库。
- 它支持的数据结构非常松散,是一种类似于 JSON 的 格式叫BSON,所以它既可以存储比较复杂的数据类型,又相当的灵活。
- MongoDB中的记录是一个文档,它是一个由字段和值对(fifield:value)组成的数据结构。MongoDB文档类似于JSON对象,即一个文档认为就是一个对象。字段的数据类型是字符型,它的值除了使用基本的一些类型外,还可以包括其他文档、普通数组和文档数组。
2.MongDB的相关概念:
- MongoDB可应对三高需求:
- High performance - 对数据库高并发读写的需求
- Huge Storage - 对海量数据的高效率存储和访问的需求
- High Scalability && High Availability- 对数据库的高可扩展性和高可用性的需求
3.MongDB的体系结构:
mysql与MongDB对比

4.MongDB的数据模型:
MongoDB的最小存储单位就是文档(document)对象。文档(document)对象对应于关系型数据库的行。数据在MongoDB中以
BSON(Binary-JSON)文档的格式存储在磁盘上。
BSON(Binary Serialized Document Format)是一种类json的一种二进制形式的存储格式,简称Binary JSON。BSON和JSON一样,支持内嵌的文档对象和数组对象,但是BSON有JSON没有的一些数据类型,如Date和BinData类型。
BSON采用了类似于 C 语言结构体的名称、对表示方法,支持内嵌的文档对象和数组对象,具有轻量性、可遍历性、高效性的三个特点,可以有效描述非结构化数据和结构化数据。这种格式的优点是灵活性高,但它的缺点是空间利用率不是很理想。
5.MongDB的特点:
- 高性能:
- 高可用性:
- 高扩展性:
- 丰富的查询支持:
6.安装与配置:
1.yum安装:
配置yum仓库:
1
2
3
4[mongodb]
name=mongo
baseurl=https://mirrors.aliyun.com/mongodb/yum/redhat/8Server/mongodb-org/4.4/x86_64/
gpgcheck=0安装:
1
yum install -y mongodb-org
配置资源限制:
1
2
3
4配置资源限制
[root@kittod ~]# vim /etc/security/limits.conf
* soft nofile 65536
* hard nofile 655361
2
3
4
5
6
7默认情况下 MongoDB运行使用 mongod用户和下面的默认目录
这种安装方式将创建默认目录,并将这些目录的所有者和组设置为 mongod。
[root@quruixiang yum.repos.d]# ll /var/lib/mongo/
total 0
[root@quruixiang yum.repos.d]# ll /var/log/mongodb
total 0
-rw-r----- 1 mongod mongod 0 Sep 29 05:53 mongod.log重启MongoDB:
1
systemctl restart mongod
连接MongoDB
1
mongo --host=127.0.0.1 --port=27017
2.docker安装:
创建mongdb目录并打开它:
1
mkdir ~/mongdb & cd ~/mongodb
方式一:无账号密码,不需要认证的安装:
1
2
3
4
5docker run -d --name mongodb --restart always --privileged -p 27017:27017 \
-v $PWD/data:/data/db mongo:4.2.2
参数:
--privileged 拥有真正的root权限
--restart=always Docker服务重启容器也启动1
docker exec -it mongodb /bin/bash
1
mongo
方式二:有账号密码,需要认证的安装:
1
2
3
4
5
6
7
8docker run -d --name mongodb --restart always --privileged -p 27017:27017 -v $PWD/data:/data/db \
-e MONGO_INITDB_ROOT_USERNAME=admin \
-e MONGO_INITDB_ROOT_PASSWORD=123456 \
mongo:4.2.2 mongod --auth
参数:
-e MONGO_INITDB_ROOT_USERNAME=admin 指定用户名
-e MONGO_INITDB_ROOT_PASSWORD=123456 指定密码
mongod --auth :容器默认启动命令是mongod,我们认证需要修改启动命为mongod --auth开启认证1
docker exec -it mongodb /bin/bash
1
mongo --host=127.0.0.1 --port 27017 -u admin -p 123456 --authenticationDatabase admin
7.数据库增删改查:
描述:
- 一个 mongodb 中可以建立多个数据库。 MongoDB 的默认数据库为”db”
- 该数据库存储在 data 目录中
- MongoDB 的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限, 不同的数据库也放置在不同的文件中
创建数据库和使用数据库:(新创建的数据库不会显示到数据库列表,除非数据库中有数据)
1
use [数据库名]
1
2
3
4
5
6
7
8
9
10命名规范:
不能是空字符串("")
不得含有' '(空格)、.、$、/、\和\0 (空字符)
应全部小写
最多 64 字节
admin: 从权限的角度来看,这是"root"数据库。要是将一个用户添加到这个 数据库,这个用户
自动继承所有数据库的权限。一些特定的服务器端命令也只 能从这个数据库运行,比如列出所有
的数据库或者关闭服务器
local: 这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集 合
config: 当 Mongo 用于分片设置时,config 数据库在内部使用,用于保存分片 的相关信息查看所有数据库:
1
show dbs
查看当前正在使用的数据库:
1
db
删除数据库:(先使用数据库)
1
db.dropDatabase()
8.集合(表)增删改查:
描述:
- 文档是一组键值(key-value)对(即 BSON)
- MongoDB 的文档不需要设置相同的字段, 并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别
创建集合:当向一个集合中插入一个文档的时候,如果集合不存在,则会自动创建集合
1
2
3db.createCollection(name)
例:
db.createCollection("mycollection")查询当前库中的j集合:
1
show collections
集合的删除:
1
2
3db.集合.drop()
例:
db.book.drop()
9.文档(行)增删改查:
1.新增数据:
1 | db.集合名称.insert(文档) |
2.修改数据:
修改满足条件的一条数据:(遇到数据修改后结束)
1
2
3db.集合名称.update(条件,{操作种类:{文档}})
例:
db.book.update({name:"springboot"},{$set:{name:"springboot2"}})修改满足条件的一条数据:(让数值加一)
1
2
3db.集合名称.update(条件,{操作种类:{文档}})
例:
db.book.update({name:"spring"},{$inc:{count:NumberInt(1)}})修改满足条件的多条数据:
1
2
3db.集合名称.update(条件,{操作种类:{文档}},{multi:true})
例:
db.book.update({name:"springboot"},{$set:{name:"springboot2"}},{multi:true})
3.查看数据:
基础查询:
查询全部:
1
db.集合.find({})
查询第一条:
1
2
3db.集合.findOne({文档})
例:
db.book.findone({name:"spring"})查询指定数量文档:
1
db.集合.find({文档}).limit(10)
跳过指定数量文档:
1
db.集合.find({文档}).skip(20)
统计:
1
db.集合.count()
按条件排序:
1
2
3db.集合名称.find().sort(排序方式)
例:
db.comment.find().sort({userid:-1,likenum:1})投影:
1
db.集合名称.find(条件,{文档})
高级查询:
模糊查询:
1
2
3
4db.集合.find({域名:/正则表达式/})
例:
db.comment.find({content:/开水/}) //包含“开水”的所有文档
db.comment.find({content:/^专家/}) //以“专家”开头的的文档条件比较运算:
1
2
3
4
5
6
7
8
9db.集合.find({字段:{关键词:值}})
关键词:
大于:$gt
小于: $lt
大于等于: $gte
小于等于: $lte
不等于:$ne
例:
db.comment.find({likenum:{$gt:NumberInt(700)}})比较连接查询:
1
2
3
4
5
6
7db.集合.find(连接词:[{字段:{关键词:值}},{...}])
连接词:
和:$and
或:$or
例:
db.comment.find({$and:[{likenum:{$gte:NumberInt(700)}},{likenum:{$lt:NumberInt(2000)}}]}) //大于等于700 并且小于2000的文档
db.comment.find({$or:[ {userid:"1003"} ,{likenum:{$lt:1000} }]}) //userid为1003,或者点赞数小于1000的文档包含查询:(等同于SQL中的in)
1
2
3
4
5
6
7db.集合.find({域名:{关键词:[值1,值2]}})
关键词:
包含:$in
不包含:$nin
例:
db.comment.find({userid:{$in:["1003","1004"]}}) //字段包含1003或1004的文档
db.comment.find({userid:{$nin:["1003","1004"]}}) //不包含1003和1004的文档
4.删除数据:
1 | db.集合名称.remove(条件) |
10.索引操作:
索引的查看:
1
2
3db.collection.getIndexes()
例:索引的创建:
1
2
3db.collection.createIndex(keys, options)
例:索引的移除:
1
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Comment
ValineDisqus