MongoDB学习
MongoDB学习文档
作者 sachinly
MongoDB 简单介绍
MangoDB 是由C++编写的分布式文件存储的开源数据库系统。在高负载情况下,可以添加更多的节点,从而保证服务器的性能。
MongoDB主要特点
- 面向文档存储的数据库,操作起来比较方便和容易
- 可以在记录中设置任何属性的索引来实现更快的排序
- 可以通过本地和网络创建数据镜像,具有很强的可扩展性
- 如果处理能力和存储空间受到限制,可以分布到其他网络节点上
- 支持丰富的查询表达式。查询指令使用json形式的标记,可以轻易查询到内嵌的对象和数组。
- 使用update()命令替换已经完成的文档或数据,也可以更新部分字段的数据
- Map/Reduce是使用Javascript编写,用来对数据的进行批量处理和聚合操作
- GridFS是MongoDB的内置功能,可以用来存放大量小文件
- MongoDB 服务端支持自定义JS脚本执行,并可以存储JS脚本以方便调用
- MongoDB Client 支持多种语言:Java、Ruby、Python、C++、PHP和JS等10多种编程语言
- MongoDB 安装部署简单
MongoDB Linux 安装
- Ubuntu 在线安装
- 添加公钥
wget -qO - https://www.mongodb.org/static/pgp/server-4.2.asc | sudo apt-key add -
- 添加安装源
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.2 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.2.list
- 更新
sudo apt-get update
- 安装mongoDB
sudo apt-get install mongodb-org
- 离线安装
- 下载
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu1804-4.2.6.tgz
- 依赖库安装
sudo apt-get install libcurl4 openssl
- 解压安装
tar -zxvf mongodb-linux-x86_64-ubuntu1804-4.2.6.tgz
sudo cp mongodb-linux-x86_64-ubuntu1804-4.2.6/bin/* /usr/local/bin/
- 手动创建文件夹
sudo mkdir -p /var/lib/mong
sudo mkdir -p /var/log/mongodb
sudo chownwhoami
/var/lib/mongo # Or substitute another user
sudo chownwhoami
/var/log/mongodb # Or substitute another user
- 配置文件
sudo touch /etc/mongos.conf
在配置文件`/etc/mongos.conf`添加如下内容
# Where and how to store data.
storage:
dbPath: /var/lib/mongodb
journal:
enabled: true
# engine:
# mmapv1:
# wiredTiger:
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongod.log
# network interfaces
net:
port: 27017
bindIp: 127.0.0.1
# how the process runs
processManagement:
timeZoneInfo: /usr/share/zoneinfo
- 控制和自启动
- 启动
sudo systemctl start mongod
- 停止
sudo systemctl stop mongod
- 状态
sudo systemctl status mongod
- 自启动
sudo systemctl enable mongod
- 测试
mongo
如下显示
MongoDB shell version v4.2.6
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("dfa3b6d1-43e4-4555-a6a7-015415baeaca") }
MongoDB server version: 4.2.6
Server has startup warnings:
2020-05-18T10:01:52.767+0800 I STORAGE [initandlisten]
2020-05-18T10:01:52.767+0800 I STORAGE [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
2020-05-18T10:01:52.767+0800 I STORAGE [initandlisten] ** See http://dochub.mongodb.org/core/prodnotes-filesystem
2020-05-18T10:01:53.922+0800 I CONTROL [initandlisten]
2020-05-18T10:01:53.923+0800 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database.
2020-05-18T10:01:53.923+0800 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted.
2020-05-18T10:01:53.923+0800 I CONTROL [initandlisten]
---
Enable MongoDB's free cloud-based monitoring service, which will then receive and display
metrics about your deployment (disk utilization, CPU, operation statistics, etc).
The monitoring data will be available on a MongoDB website with a unique URL accessible to you
and anyone you share the URL with. MongoDB may use this information to make product
improvements and to suggest MongoDB products and deployment options to you.
To enable free monitoring, run the following command: db.enableFreeMonitoring()
To permanently disable this reminder, run the following command: db.disableFreeMonitoring()
---
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
- 卸载
- 停止服务
sudo service mongod stop
- 卸载
sudo apt-get purge mongodb-org*
- 删除数据和配置文件
sudo rm -r /var/log/mongodb
sudo rm -r /var/lib/mongodb
sudo rm /etc/mongos.conf
MongoDB 概念解析
在任何服务或者软件中首先要了解其概念名词术语
SQL术语 | MongoDB术语 | 解释说明 |
---|---|---|
database | database | 数据库/数据库 |
table | collections | 表/集合 |
row | document | 数据记录/文档 |
column | field | 数据字段/域 |
index | index | 索引/索引 |
table join | —— | 表连接/mongoDB不支持 |
primary key | primary key | 主键/mongoDB自动将_id域作为索引 |
-
数据库
MongoDB 可创建多个独立的数据库,admin local config 是系统默认保留的数据库。数据库名最大支持64个字符,应全部小写。 -
集合
MongoDB中的文档相当于关系型数据库的表。集合存于数据库中,集合没有固定的结构,意味着可以插入不同格式不同类型的数据,通常情况下集合中的数据是有一定的关联性。当文档数据插入数据库时,集合就会被创建。集合名称不能以'system'开头,system是系统集合保留的前缀名。 -
文档
文档是一组键值对,MongoDB的文档不需要设置相同的字段,并且相同的字段不需要相同的类型。这是与关系型数据库最大的区别,也是mongoDB的突出特点。 -
数据类型如下表
类型 | 描述 |
---|---|
String | 字符串。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。 |
Integer | 整型数值。用于存储数值。根据你所采用的服务器,可分为 32 位或 64 位。 |
Boolean | 布尔值。用于存储布尔值(真/假)。 |
Double | 双精度浮点值。用于存储浮点值。 |
Min/Max keys | 将一个值与 BSON(二进制的 JSON)元素的最低值和最高值相对比。 |
Array | 用于将数组或列表或多个值存储为一个键。 |
Timestamp | 时间戳。记录文档修改或添加的具体时间。 |
Object | 用于内嵌文档。 |
Null | 用于创建空值。 |
Symbol | 符号。该数据类型基本上等同于字符串类型,但不同的是,它一般用于采用特殊符号类型的语言。 |
Date | 日期时间。用 UNIX 时间格式来存储当前日期或时间。你可以指定自己的日期时间:创建 Date 对象,传入年月日信息。 |
Object ID | 对象 ID。用于创建文档的 ID。 |
Binary Data | 二进制数据。用于存储二进制数据。 |
Code | 代码类型。用于在文档中存储 JavaScript 代码。 |
Regular expression | 正则表达式类型。用于存储正则表达式。 |
MongoDB远程连接配置
- 添加管理员用户
mongo
> use admin
> db.createUser(
{
user: "admin",
pwd: "Admin@123",
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
}
)
Mongodb 内置角色介绍
数据库用户角色
- read: 只读数据权限
- readWrite:读写数据权限
数据库管理角色
- dbAdmin: 在当前db中执行管理操作的权限
- dbOwner: 在当前db中执行任意操作
- userADmin: 在当前db中管理user的权限
备份和还原角色
- backup
- restore
夸库角色
- readAnyDatabase: 在所有数据库上都有读取数据的权限
- readWriteAnyDatabase: 在所有数据库上都有读写数据的权限
- userAdminAnyDatabase: 在所有数据库上都有管理user的权限
- dbAdminAnyDatabase: 管理所有数据库的权限
集群管理
- clusterAdmin: 管理机器的最高权限
- clusterManager: 管理和监控集群的权限
- clusterMonitor: 监控集群的权限
- hostManager: 管理Server
超级权限
- root: 超级用户
-
数据库添加用户
mongo
> use dbname > db.createUser( { user: "dbuser", pwd: "dbuser@123", roles: [ { role: "readWrite", db: "dbname" } ] } )
-
修改配置文件
vim /etc/mongod.conf
```
storage:
dbPath: /var/lib/mongodb
journal:
enabled: true
# engine:
# mmapv1:
# wiredTiger:
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongod.log
net:
port: 27017
bindIp: 127.0.0.1
processManagement:
timeZoneInfo: /usr/share/zoneinfo
security:
authorization: enabled
#operationProfiling:
#replication:
#sharding:
## Enterprise-Only Options:
#auditLog:
#snmp:
```
修改`security` 标签下的`authorization` 为`enabled` 即开启认证。然后重启服务
修改`net` 标签下的`port` 端口和`bindIp`地址,允许远程访问修改为`0.0.0.0` 本地访问`127.0.0.1`
- 删除用户
首先修改配置文件,即注释掉 security
下的authorization
然后重启
mongo
> use dbname
> db.dropUser("dbuser")
MongoDB客户端连接
使用用户名和密码连接到远程的指定数据库上
mongodb://username:password@host/dbname
分布式的在其他章节介绍
python3 连接 MongoDB Server
pip3 install pymongo
#!/usr/bin/python3
import pymongo
myclient = pymongo.MongoClient("mongodb://dbuser:dbuser@123@127.0.0.1/dbname")
mycol = myclient["col_test"]
MongoDB 数据库、文档、集合的创建删除
- 数据库
- 创建数据库
use dbname #如果数据库不存在则创建,如果数据库存在则切换到该数据库。
show dbs #列出所有数据库,只有数据库有内容数据库才会被真正的创建,如果是空数据库要想被显示,则需要插入数据。
db.dbcol.insert({"key":"value"}) #自动创建集合dbcol
并插入数据
- 删除数据库
use dbname
db.dropDatabase()
若数据库中没有集合没有数据,数据库会自动删除
- 集合
- 创建集合
db.createCollection(colname, options)
`colname`是集合名称,`options`是选项
- 删除集合
db.colname.drop()
show collections
可列出当前数据库下所有的集合colname
是集合名称
options 说明
字段 | 类型 | 描述 |
---|---|---|
capped | Boolean | 是否创建固定集合,如果是必须指定固定集合大小size |
autoIndexId | Boolean | 是否自动在_id 上创建索引,默认是false |
size | Integer | 固定集合指定的最大值,单位是KB |
max | Integer | 固定集合的文档的最大数量 |
插入文档时,MongoDB先检查size 然后检查max,若达到最大值,新插入的就会覆盖最旧的文档
- 文档
文档的数据结构和JSON基本一样,所有存储在集合的数据都是BSON格式,BSON就是Binary Json
- 插入文档
db.COLLECTION_NAME.insert(document)
db.collection.insertOne()
和 db.collection.insertMany()
分别是一次插入一个和多个
db.colname.insert({
"title":"mogo",
"msg":{"aa","bbb"}
})
-
删除文档
db.COLLECTION_NAME.remove(DELECTION_CRITERIA)
DELECTION_CRITERIA
为删除条件
db.colname.remove({"title":"mogo"})
此处的{"title":"mogo"}
是查询条件
-
更新文档
MongoDB文档更新有
update()
和save()
两个方法db.COLLECTION_NAME.update(SELECTION_CRITERIA, UPDATED_DATA,{multi:true})
SELECTION_CRITERIA
是查询条件UPDATED_DATA
是更新的数据db.colname.update({"title":"mogo"},{$set:{ "title":"MongoDB title", "msg":{"aa":"cccc"} }},{multi:false})
若查询结果有多个满足条件,
multi:true
决定是否全部更新。db.COLLECTION_NAME.save({_id:ObjectId(), NEW_DATA})
_id
内容存在则update,若不存在则插入。 -
查询文档
db.collection.find(query, projection)
query
为查询条件,projection
返回数据指定键,默认全部返回db.col.find().pretty()
pretty()
格式化输出查询内容,若将find()
替换为findOne()
则返回一个内容AND
条件db.col.find({key1:value1, key2:value2}).pretty()
OR
条件db.col.find({ $or: [ {key1: value1}, {key2:value2}]}).pretty()
操作运算符
操作符 | 格式 | 范例 | RDBMS类似的语句 |
---|---|---|---|
等于 | {key:value} | db.col.find({"ti":"mogo"}).pretty() | where ti = 'mogo' |
小于 | {key:{$lt:value}} | db.col.find({"likes":{$lt:50}}).pretty() | where likes < 50 |
小于或等于 | {key:{$lte:value}} | db.col.find({"likes":{$lte:50}}).pretty() | where likes <= 50 |
大于 | {key:{$gt:value}} | db.col.find({"likes":{$gt:50}}).pretty() | where likes > 50 |
大于或等于 | {key:{$gte:value}} | db.col.find({"likes":{$gte:50}}).pretty() | where likes >= 50 |
不等于 | {key:{$ne:value}} | db.col.find({"likes":{$ne:50}}).pretty() | where likes != 50 |
===
后面还会继续介绍关于查询的内容