MongoDB操作基本教程

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:

在 MongoDB 中,核心进程主要包含了 mongod、mongos 和 mongosh 三个。

其中最主要的是 mongod 程序,其在不同的部署方案中(单机部署、副本集部署、分片集群部署),通过不同的配置,可以扮演多种不同的角色:

在单机部署中作为数据库服务器(提供所有读写功能)
在副本集部署中,通过配置,可以部署为 Primary 节点(负责写数据,也可以提供查询)、Secondary 节点(从主节点复制数据,也可以提供查询)、以及 Arbiter 节点(不保存数据,主要用于参与选举投票)
在分片集群中,除了在每个分片中扮演上述角色外,还扮演着配置服务器的角色(存储有分片集群的所有元数据信息,mongos 的数据路由分发等都要依赖于它)
在一台服务器上,可以启动多个 mongod 服务。但在实际生产部署中,通常是建议一台服务器部署一个

规则

  • 文档中的键/值对是有序的。
  • 文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。
  • MongoDB区分类型和大小写。
  • MongoDB的文档不能有重复的键。
  • 文档的键是字符串。

原有库

admin: 存放有数据库帐号相关信息,在身份验证和授权时使用
local: 特定于单个服务器的数据会存储在此数据库中。在副本集中,local 数据库用于存储复制过程中所使用的数据,而其本身不会被复制。
config: 用于分片集群环境,存放了分片相关的元数据信息

类型

最新类型文档
目前多了number的int32, long,Decimal128,类型检查

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 直接连接即可

关闭免密登录

  1. 启用认证

找到mongo的安装目录x:\MongoDB\Server\version\bin下的 mongod.cfg 文件,在 #security: 下添加下面代码

security:
 authorization: enabled
  1. 重启服务
net stop mongodb
net start mongodb
  1. 创建用户

db.createUser({user:“admin”,pwd:“123456”,roles:[“root”]})

  1. 使用用户名连接
  • (1)使用用户名密码连接

mongosh文档

mongosh连接带认证方式

mongosh --port 27017 --authenticationDatabase “admin” -p // 回车输入密码

  • (2)直接进去,然后再进行认证。

直接连接是可以进去的,但是无法对数据库里面的表进行操作,只能看到有表

进入后进行认证,然后就可以操作了

use admin
db.auth("admin", "123456")
  1. 其他命令
db.dropUser('admin')  # 删除用户 
db.updateUser('admin', {pwd: '654321'})  # 修改用户密码  
db.createUser({user:"你自定义的用户名",pwd:"你自定义的密码",roles:[{role:"readWrite",db:"test"}]}) # 对具体数据库设置用户权限 

ps 权限说明

(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

聚合函数

直接看文档

备份和恢复

mongodump文档

说明,已经不使用-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:主从分片

主从

分片

你可能感兴趣的:(SQL,mongodb,数据库)