MongoDB
版本(重要)
v6.0.7
可执行文件说明
bin目录下默认可执行文件说明
- mongod 实例,这样不仅减少资源竞争,而且服务器故障也不会同时影响到多个服务。
- mongos 在分片集群中扮演路由的角色,提供客户端和分片之间的接口。
- mongosh 是 MongoDB 集成的交互式 shell 工具。
数据库工具
需要另外下载:https://www.mongodb.com/try/download/shell
图形界面工具:https://www.mongodb.com/try/download/compass
MongoDB 数据库工具是用于处理 MongoDB 部署的命令行实用程序的集合。数据库工具包括以下二进制文件:
二进制导入导出
mongodump: 导出 mongod 数据库的二进制数据
mongorestore: 恢复 mongodump 导出文件的数据到 mongod 或 mongos 数据库
bsondump: 转换 BSON 导出文件成 JSON 格式
数据导入导出
mongoimport: 从外部 JSON、CSV 或 TSV 文件中加载数据
mongoexport: 从 mongod 实例中导出数据到 JSON 或 CSV 文件中
诊断工具
mongostat: 快速诊断当前运行的 mongod 或 mongos 实例的状态
mongotop: 统计 mongod 实例读取和写入数据的时间
GridFS 工具
mongofiles: 支持在 GridFS 对象中操作 MongoDB 实例中存储的文件
ps:
bash
在 MongoDB 中,核心进程主要包含了 mongod、mongos 和 mongosh 三个。
其中最主要的是 mongod 程序,其在不同的部署方案中(单机部署、副本集部署、分片集群部署),通过不同的配置,可以扮演多种不同的角色:
在单机部署中作为数据库服务器(提供所有读写功能)
在副本集部署中,通过配置,可以部署为 Primary 节点(负责写数据,也可以提供查询)、Secondary 节点(从主节点复制数据,也可以提供查询)、以及 Arbiter 节点(不保存数据,主要用于参与选举投票)
在分片集群中,除了在每个分片中扮演上述角色外,还扮演着配置服务器的角色(存储有分片集群的所有元数据信息,mongos 的数据路由分发等都要依赖于它)
在一台服务器上,可以启动多个 mongod 服务。但在实际生产部署中,通常是建议一台服务器部署一个
规则
- 文档中的键/值对是有序的。
- 文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。
- MongoDB区分类型和大小写。
- MongoDB的文档不能有重复的键。
- 文档的键是字符串。
原有库
admin: 存放有数据库帐号相关信息,在身份验证和授权时使用
local: 特定于单个服务器的数据会存储在此数据库中。在副本集中,local 数据库用于存储复制过程中所使用的数据,而其本身不会被复制。
config: 用于分片集群环境,存放了分片相关的元数据信息
类型
目前多了number的int32, long,Decimal128,类型检查
bash
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 正则表达式类型。用于存储正则表达式。
ObjectId组成:时间戳(4)+机器码(3)+PID(3)+计数器(3)
从ObjectId可得到数据戳,所以不需要记录创建时间
var id = ObjectId()
id.getTimestamp() // 2023-07-13T06:02:28.000Z
id.toString() // 64af93742f23b81ba99ae1e4
日期
var myDate = new Date()
myDate.toString()
Date()
命令操作
连接数据库
以前是使用mongo命令连接,现在使用mongosh连接
默认没有启用访问控制,所以默认是没有用户名的
一般连接
mongosh 直接连接即可
关闭免密登录
找到mongo的安装目录x:\MongoDB\Server\version\bin
下的 mongod.cfg 文件,在 #security: 下添加下面代码
bash
security:
authorization: enabled
- 重启服务
bash
net stop mongodb
net start mongodb
db.createUser({user:"admin",pwd:"123456",roles:["root"]})
- 使用用户名连接
- (1)使用用户名密码连接
mongosh --port 27017 --authenticationDatabase "admin" -p // 回车输入密码
- (2)直接进去,然后再进行认证。
直接连接是可以进去的,但是无法对数据库里面的表进行操作,只能看到有表
进入后进行认证,然后就可以操作了
bash
use admin
db.auth("admin", "123456")
- 其他命令
bash
db.dropUser('admin') # 删除用户
db.updateUser('admin', {pwd: '654321'}) # 修改用户密码
db.createUser({user:"你自定义的用户名",pwd:"你自定义的密码",roles:[{role:"readWrite",db:"test"}]}) # 对具体数据库设置用户权限
ps 权限说明
bash
(1)数据库用户角色:read(只读)、readWrite(可读写);
(2)数据库管理角色:dbAdmin(在当前db中执行管理操作的权限)、dbOwner(在当前db中执行任意操作)、userAdmin(在当前db中管理user的权限);
(3)集群管理角色:clusterAdmin(管理机器的最高权限)、clusterManager(管理和监控集群的权限)、clusterMonitor(监控集群的权限)、hostManager( 管理Server);
(4)备份恢复角色:backup、restore;
(5)所有数据库角色:readAnyDatabase(在所有数据库上都有读取数据的权限)、readWriteAnyDatabase(在所有数据库上都有读写数据的权限)、userAdminAnyDatabase(在所有数据库上都有管理user的权限)、dbAdminAnyDatabase(管理所有数据库的权限);
(6)超级用户角色:root(超级用户)
查看数据库版本
外部
mongod --version
内部
db.version()
创建库
use airec // 创建
db // 查看当前数据库
ps:此时看不到数据库,需要插入集合和数据才行
crud[curd]
删除
use airec // 切换数据库
db.dropDatabase() // 删除
show dbs // 查看是否成功
创建集合(有可选参数)
use airec
db.createCollection('behavior')
db.createCollection("item")
db.createCollection("user")
db.createCollection("test")
删除集合
use airec
db.dropCollection("test")
show collections // 查看集合
show tables // 查看集合
插入文档
db.behavior.insert({title:"test"})
查找文档
db.behavior.find()
db.behavior.find().pretty()
查找 and
db.behavior.find({key: value})
查找 or
db.behavior.find($or:[{key: value}, {key2, value2}])
查找 条件
db.behavior.find({age: {$gt: 3}}) // 其他类似 $gt $gte $lt $lte
更新文档
db.behavior.updateOne({where}, {KaTeX parse error: Expected 'EOF', got '}' at position 12: set: {data}}̲) db.behavior.u...set: {data}})
删除文档
db.col.remove({条件},justOne:false) // 默认删除所有
db.behavior.remove({name:"hjj"}) // 删除所有name为"hjj"的文档db.behavior.remove({name:"hjj", 1}) // justOne 只删除一条匹配到的文档
remove 过期,使用以下代替
db.behavior.deleteOne()
db.behavior.deleteMany()
查找时根据字段类型过滤-$type
用于返回需要的字段的类型筛选
可字符串,可数字代表级别
db.behavior.find({age: {KaTeX parse error: Expected 'EOF', got '}' at position 8: type: 2}̲}) // 查找字符串的age...type: string}}) // 查找字符串的age
聚合函数
直接看文档
备份和恢复
说明,已经不使用-o dict
来输出,而是使用--archive=dict
更新换代快,还是得看直接看文档,被坑了半天。。。
归档备份
mongodump -u admin -p="" --authenticationDatabase=admin --archive=D:/bk/mongodump-airec-db --db=airec
恢复备份
mongorestore mongodump -u admin -p="" --authenticationDatabase=admin --archive=D:/bk/mongodump-airec-db --db=airec
TODO:主从分片