自建 MongoDB 实践:MongoDB 的安装及基本使用

数据库 MongoDB
在进入正题前,我们先自问自答一下为什么要自建 MongoDB?如果不自建则使用公有云厂商提供的 SaaS 版,其费用会怎样呢?我们这里以阿里云为例。首先看下SaaS 版(分片集群所需要的配置)的费用问题。

接下来的一些列文章会为大家介绍日常工作中常用的 NoSQL 产品 MongoDB。主要涉及到:

1、MongoDB 的安装及基本使用

2、MongoDB 文档查询

3、MongoDB 复制集的介绍及搭建

4、MongoDB 分片集群的介绍及搭建

5、MongoDB 的备份及恢复

6、MongoDB 安全加密

7、MongoDB Change Stream 功能介绍及代码演示

8、MongoDB 其他

我们会用八篇文章近五万字来阐述 MongoDB 运维相关的日常实战事宜。您当前看到的是系列文章的第一篇:《MongoDB 的安装及基本使用》。

闲篇

在进入正题前,我们先自问自答一下为什么要自建 MongoDB?如果不自建则使用公有云厂商提供的 SaaS 版,其费用会怎样呢?我们这里以阿里云为例。首先看下SaaS 版(分片集群所需要的配置)的费用问题。

图片

那么上述配置的费用为:96.316 * 24 * 365 = 843728.16 元。如果觉得上述配置比较高,可以考虑降低一些配置,那么费用如下图所示:

图片

那么上述配置的费用为:58.774 * 24 * 365 = 514860.24 元。

可以看到,如果对数据安全性要求比较高,使用分片集群的话,每年的费用至少是 50 ~ 80 万元。如果不差钱到无所谓,如果预算有限,项目上还必须要使用的话,就必须要自己来搭建维护了。

文档

MongoDB 将数据记录存储为 BSON 文档。BSON 是 JSON 文档的二进制表示形式,尽管它包含的数据类型比 JSON 多。有关 BSON 规范,请参阅 bsonspec.org(http://bsonspec.org/)。另请参阅 BSON

MongoDB 将 BSON 文档(即数据记录)存储在集合中;将集合存储在数据库中。文档是 MongoDB 的核心概念。多个键及其关联的值有序地放置在一起便是文档。

  • 文档中的键/值对是有序的。
  • 文档中的值不仅可以是在双引号里面的字符串,还可以是其它几种数据类型。
  • 文档的键是字符串。除了少数例外情况,键可以是任意 UTF8 字符。
  • 键不能含有 \0(空字符)。这个字符用来表示键的结尾。
  • 和 $ 有特别的意义,只有在特定环境下才能使用。
  • 以下划线 _ 开头的键是保留的,虽然这个并不是严格要求的。
  • MongoDB 不但区分类型,也区分大小写。MongoDB 的文档不能有重复的键。

集合

集合就是一组文档。如果说 MongoDB 中的文档类似于关系型数据库中的行,那么集合就如同表。

数据库

MongoDB 中多个文档组成集合,同样多个集合可以组成数据库。一个 MongoDB 实例可以承载多个数据库,它们之间可视为完全独立的。每个数据库都有独立的权限控制,即便是在磁盘上,不同的数据库也放置在不同的文件中。

图片

与关系型数据库的对比

与关系型数据库的区别:

图片

总结一下 MongoDB 与 RDBMS 的区别:

  • 数据库及索引 (类似 SQL 的数据库)
  • 集合 (类似 SQL 的表)
  • 文档 (类似 SQL 的行)
  • 字段 (类似 SQL 的列)
  • 嵌入及关联的文档 (类似 SQL 的连接(join))

一些更具体的对比如下表格:

图片

图片

MongoDB 的特点及使用场景

一些关键特征如下:

  • 它是一个通用数据库:与为特定目的构建的其他 NoSQL 数据库(例如图形数据库)不同,MongoDB 可以在应用程序中提供异构负载和多种用途。在 4.0 版本还引入多文档 ACID 事务。
  • 灵活的模式设计:具有可以随时修改的非定义属性的面向文档的方法是 MongoDB 和关系数据库之间的关键对比。
  • 轻松实现高可用性:在我们可用性为五个九的时代,这必须是理所当然的。再加上检测到服务器故障时的自动故障转移,这有助于实现高正常运行时间。
  • 功能丰富:提供全方位的SQL 等效运算符,以及 MapReduce、聚合框架、Time to Live 和上限集合以及二级索引等功能,无论需求多么多样化,MongoDB 都可以适应许多用例。
  • 可扩展性和负载平衡:它是为垂直和(主要是)水平缩放而构建的。使用分片,架构师可以在不同实例之间共享负载,并实现读写可扩展性。数据平衡通过碎片均衡器自动进行(对用户透明)。
  • 聚合框架:在数据库中内置 ETL 框架意味着开发人员可以在数据离开数据库之前执行大部分 ETL 逻辑,在许多情况下,无需复杂的数据管道。
  • 原生复制:数据将在副本集中复制,而无需复杂的设置。
  • 安全功能:将身份验证和授权都考虑在内,以便架构师可以保护他们的 MongoDB 实例。
  • 用于存储和传输文档的JSON(BSON和二进制JSON)对象:JSON 在网络上广泛用于前端和 API 通信,因此,当数据库使用相同的协议时会更容易。
  • MapReduce:尽管 MapReduce 引擎不如专用框架先进,但它仍然是构建数据管道的绝佳工具。
  • 多文档ACID事务:从 4.0 版本开始,MongoDB 支持跨多个文档的 ACID 事务。
  • 成熟工具:MongoDB 的工具已发展到支持从 DBaaS 到 Sync、Mobile 和无服务器(Stitch)。

其许多最成功的用例集中在以下领域:

  • 整合简洁数据,提供单一视图
  • IoT 物联网
  • 移动应用程序
  • 实时分析
  • 个性化
  • 目录管理
  • 内容管理

安装

版本选择

通常情况下,我们应该选择偶数版本(如:4.2)。奇数版本(如:4.3)是开发版本,不适合在生产环境中使用。目前,MongoDB 已经发展到了 6.0 版本。但从公有云厂商提供的版本(3.4、4.0、4.2)来看,4.x 版本依然是主流。因此,我们这里选择了最新的 4.4 版本。

环境准备

我们这里选择 CentOS 7.9 作为接下来所有的演示操作,当然我们也可以选择其他发行版。

[root@mongo01 ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)

系统设置

[root@mongo01 ~]# echo "never" > /sys/kernel/mm/transparent_hugepage/enabled
[root@mongo01 ~]# echo "never" > /sys/kernel/mm/transparent_hugepage/defrag

上述是临时性的设置,系统重启就会失效。永久性设置:

[root@mongo01 ~]# cat >> /etc/rc.d/rc.local <<EOF
if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
echo "never" > /sys/kernel/mm/transparent_hugepage/enabled
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
echo "never" > /sys/kernel/mm/transparent_hugepage/defrag
fi
EOF

由于 /etc/rc.d/rc.local 文件默认没有可执行权限,需要增加可执行权限,那么在下次开机时它会自动执行。如下:

[root@mongo01 ~]# chmod +x /etc/rc.d/rc.local 

[root@mongo01 ~]# ls -l /etc/rc.d/rc.local
-rwxr-xr-x. 1 root root 725 Jul 29 02:32 /etc/rc.d/rc.local

开始安装

可以参考官方安装文档:https://www.mongodb.com/docs/v4.4/administration/install-on-linux/,写的非常详细,里面包含了各种 Gnu/Linux 发行版的安装方式。

yum 方式安装

创建 /etc/yum.repos.d/mongodb-org-4.4.repo 文件,这样我们就可以通过 yum 命令进行安装 MongoDB:

(venv36) [root@mongo01 ~]# cat >> /etc/yum.repos.d/mongodb-org-4.4.repo <<"EOF"
[mongodb-org-4.4]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.4/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.4.asc
EOF

接着进行安装:

(venv36) [root@mongo01 ~]# yum install -y mongodb-org

安装完毕,查看已经安装的软件包:

[root@mongo01 ~]# rpm -qa |grep mongod
mongodb-org-server-4.4.15-1.el7.x86_64
mongodb-org-mongos-4.4.15-1.el7.x86_64
mongodb-org-shell-4.4.15-1.el7.x86_64
mongodb-org-database-tools-extra-4.4.15-1.el7.x86_64
mongodb-org-tools-4.4.15-1.el7.x86_64
mongodb-database-tools-100.5.4-1.x86_64
mongodb-org-4.4.15-1.el7.x86_64

MongoDB 社区版包含以下软件包:

图片

通过 YUM 方式安装的 MongoDB,其会自动创建如下两个目录:

  • /var/lib/mongo (数据目录)
  • /var/log/mongodb (日志目录)

而且会使用 mongod 用户运行 MongoDB。接下来启动服务:

(venv36) [root@mongo01 ~]# systemctl start mongod

(venv36) [root@mongo01 ~]# systemctl status mongod
● mongod.service - MongoDB Database Server
Loaded: loaded (/usr/lib/systemd/system/mongod.service; enabled; vendor preset: disabled)
Active: active (running) since Fri 2022-07-29 02:09:03 UTC; 3s ago
Docs: https://docs.mongodb.org/manual
Process: 3716 ExecStart=/usr/bin/mongod $OPTIONS (code=exited, status=0/SUCCESS)
Process: 3713 ExecStartPre=/usr/bin/chmod 0755 /var/run/mongodb (code=exited, status=0/SUCCESS)
Process: 3710 ExecStartPre=/usr/bin/chown mongod:mongod /var/run/mongodb (code=exited, status=0/SUCCESS)
Process: 3708 ExecStartPre=/usr/bin/mkdir -p /var/run/mongodb (code=exited, status=0/SUCCESS)
Main PID: 3720 (mongod)
CGroup: /system.slice/mongod.service
└─3720 /usr/bin/mongod -f /etc/mongod.conf

Jul 29 02:09:03 mongo01.tyun.cn systemd[1]: Starting MongoDB Database Server...
Jul 29 02:09:03 mongo01.tyun.cn mongod[3716]: about to fork child process, waiting until server is ready for connections.
Jul 29 02:09:03 mongo01.tyun.cn mongod[3716]: forked process: 3720
Jul 29 02:09:03 mongo01.tyun.cn mongod[3716]: child process started successfully, parent exiting
Jul 29 02:09:03 mongo01.tyun.cn systemd[1]: Started MongoDB Database Server.

(venv36) [root@mongo01 ~]# ps -ef |grep mongo |grep -v grep
mongod 3720 1 1 02:09 ? 00:00:00 /usr/bin/mongod -f /etc/mongod.conf

安装及启动完毕,我们就可以进入 MongoDB 的命令行了。在命令行中输入 mongo 即可进入 MongoDB:

[root@mongo01 ~]# mongo
MongoDB shell version v4.4.15
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("50f98507-a80d-4e23-84a2-321718a2132d") }
MongoDB server version: 4.4.15
---
The server generated these startup warnings when booting:
2022-07-29T02:35:51.390+00:00: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine. See http://dochub.mongodb.org/core/prodnotes-filesystem
2022-07-29T02:35:52.346+00:00: Access control is not enabled for the database. Read and write access to data and configuration is unrestricted
---
---
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

> exit
bye

我们看到输出中有一些警告信息(2022-07-29T02:35:52.346+00:00: Access control is not enabled for the database. Read and write access to data and configuration is unrestricted),主要是没有开启认证。接下来我们创建管理员用户,并为其创建密码。操作如下:

> use admin

> db.createUser(
{
user: "tyun",
pwd: passwordPrompt(),
roles: [
{ role: "userAdminAnyDatabase", db: "admin" },
{ role: "readWriteAnyDatabase", db: "admin" }
]
}
)

输入上述指令后,MongoDB 会提示我们输入 tyun 管理员的密码:

Enter password:

按照提示输入密码即可,这样密码就不会回显在终端上,加强安全性。

passwordPrompt() 方法提示我们输入密码,这样密码就不会回显在控制台上了。不过我们可以使用字符串直接指定密码,不过我们不建议这么做,以免在终端上留下历史记录,让别人看到。

MongoDB 提供的免费集群

MongoDB 官网提供了一个免费版的集群(512 MB 的存储空间,对于个人学习是完全够用的),我们只需要注册一个账号即可。然后根据提示进行集群的创建即可,创建完成之后的界面如下:

图片

集群详情页面:

图片

在使用的时候最好设置白名单,以增加安全性:

图片

还有好用的 Charts(类似 Kibana 的 Dashboard):

图片

打开 Dashboard:

创建用户

我们看到输出中有一些警告信息,主要是没有开启认证。接下来我们创建管理员用户,并为其创建密码。操作如下:

> use admin

> db.createUser(
{
user: "tyun",
pwd: passwordPrompt(),
roles: [
{ role: "userAdminAnyDatabase", db: "admin" },
{ role: "readWriteAnyDatabase", db: "admin" }
]
}
)

输入上述指令后,MongoDB 会提示我们输入密码:

Enter password:

按照提示输入密码即可,这样密码就不会回显在终端上,加强安全性。

passwordPrompt() 方法提示我们输入密码,这样密码就不会回显在控制台上了。不过我们可以使用字符串直接指定密码,不过我们不建议这么做,以免在终端上留下历史记录,让别人看到。

userAdminAnyDatabase 角色允许用户做如下操作:

  • 可以创建用户
  • 可以为用户授予或回收角色
  • 可以创建或修改定制的角色

如何创建一个具有 root 权限的用户:

> use admin
switched to db admin

> db.createUser({user: "root", pwd: passwordPrompt(), roles: [{role: "root", db: "admin" }]})
Enter password:
Successfully added user: {
"user" : "root",
"roles" : [
{
"role" : "root",
"db" : "admin"
}
]
}

编辑 /etc/mongod.conf 配置文件,打开安全配置:

security:
authorization:

之后重启 mongod 服务,并再次进入 MongoDB shell,就会发现警告已经没有了:

[root@mongo01 ~]# systemctl restart mongod

[root@mongo01 ~]# mongo --authenticationDatabase "admin" -u "tyun" -p
MongoDB shell version v4.4.15
Enter password: 在此处输入密码
connecting to: mongodb://127.0.0.1:27017/?authSource=admin&compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("00dbddb9-43c4-4ce1-92cd-3ff38cccec44") }
MongoDB server version: 4.4.15
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB

> exit
bye

刚才我们是以 localhost 的形式连接到该实例的,那么如何远程连接该实例呢?我们依然可以使用 mongo shell 或图形化的工具来连接。默认情况下,MongoDB 只监听了 127.0.0.1 的 27017 端口,我们需要修改一下配置,使其监听 10.20.20.19 地址。修改 /etc/mongod.conf,

net:
port: 27017
bindIp: 127.0.0.1,10.20.20.19 # Enter 0.0.0.0,:: to bind to all IPv4 and IPv6 addresses or, alternatively, use the net.bindIpAll setting.

修改完配置后,重启服务并验证端口是已监听:

(venv36) [root@mongo01 ~]# systemctl restart mongod(venv36) [root@mongo01 ~]# netstat -antup |grep 27017tcp        0      0 127.0.0.1:27017         0.0.0.0:*               LISTEN      15549/mongod        tcp        0      0 10.20.20.19:27017       0.0.0.0:*               LISTEN      15549/mongod

接下来我们看看如何使用 mongo shell 连接。

➜  mongodb-macos-x86_64-4.4.15 ./bin/mongo 10.20.20.19/admin -u tyun -p
MongoDB shell version v4.4.15
Enter password:
connecting to: mongodb://10.20.20.19:27017/admin?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("419bb64a-6ce8-4d4a-be54-b916f4a06ad2") }
MongoDB server version: 4.4.15
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
> exit
bye

在服务端我们可以看下日志,由于日志是 JSON 格式,我们把它美化一下:

{
"t": {
"$date": "2022-07-29T06:06:16.551+00:00"
},
"s": "I",
"c": "NETWORK",
"id": 51800,
"ctx": "conn2",
"msg": "client metadata",
"attr": {
"remote": "192.168.100.134:58230",
"client": "conn2",
"doc": {
"application": {
"name": "MongoDB Shell"
},
"driver": {
"name": "MongoDB Internal Client",
"version": "4.4.15"
},
"os": {
"type": "Darwin",
"name": "Mac OS X",
"architecture": "x86_64",
"version": "21.5.0"
}
}
}
}
{
"t": {
"$date": "2022-07-29T06:06:16.612+00:00"
},
"s": "I",
"c": "ACCESS",
"id": 20250,
"ctx": "conn2",
"msg": "Authentication succeeded",
"attr": {
"mechanism": "SCRAM-SHA-256",
"speculative": true,
"principalName": "tyun",
"authenticationDatabase": "admin",
"remote": "192.168.100.134:58230",
"extraInfo": {}
}
}

远程命令行连接没有问题。我们再试试图形化工具是否可以正常连接。

图片

图片

这里推荐使用 MongoDB Compass 图形化管理工具(目前可以免费使用):

首先新建连接:

图片

之后就可以像下面这样使用了:

图片

至此,一个基本可用的 MongoDB 实例算是安装及配置完成了。接下来的内容我们一起看下 MongoDB 如何使用。

常用操作

在介绍如何使用 MongoDB 之前,我们需要介绍一下如何创建库、用户及授权。

use 命令

use 命令类似于 MySQL 中的 use,不过还有点区别,如果数据库不存在,则创建。

# 语法为
> use <db_name>

# 一个例子
> use order
switched to db order

> db.orders.insert({name: "underwear", price: 20})
WriteResult({ "nInserted" : 1 })

> db.orders.find()
{ "_id" : ObjectId("62e764b8e62e3a8595db3641"), "name" : "underwear", "price" : 20 }

> db.orders.find().pretty()
{
"_id" : ObjectId("62e764b8e62e3a8595db3641"),
"name" : "underwear",
"price" : 20
}

这样就创建了一个名为 order 的库及名为 orders 的集合(表)并插入了一条文档。

show 命令

// 查看数据库,语法为:
show dbs or show databases

> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
order 0.000GB
test 0.000GB

> show databases
admin 0.000GB
config 0.000GB
local 0.000GB
order 0.000GB
test 0.000GB

// 查看结合,语法为:
show collections or show tables

> show collections
orders

> show tables
orders

// 查看用户
show users

> use admin
switched to db admin

> show users
{
"_id" : "admin.admin",
"userId" : UUID("5701b2b3-cb50-4c50-ba48-3deda0977a8f"),
"user" : "admin",
"db" : "admin",
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
},
{
"role" : "readWriteAnyDatabase",
"db" : "admin"
}
],
"mechanisms" : [
"SCRAM-SHA-1",
"SCRAM-SHA-256"
]
}
{
"_id" : "admin.tyun",
"userId" : UUID("c1051c23-23ca-48c7-81c4-34b0fe22a5c2"),
"user" : "tyun",
"db" : "admin",
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
},
{
"role" : "readWriteAnyDatabase",
"db" : "admin"
}
],
"mechanisms" : [
"SCRAM-SHA-1",
"SCRAM-SHA-256"
]
}

// 查看角色
show roles

> show roles
{
"role" : "__queryableBackup",
"db" : "admin",
"isBuiltin" : true,
"roles" : [ ],
"inheritedRoles" : [ ]
}
{
"role" : "__system",
"db" : "admin",
"isBuiltin" : true,
"roles" : [ ],
"inheritedRoles" : [ ]
}
{
"role" : "backup",
"db" : "admin",
"isBuiltin" : true,
"roles" : [ ],
"inheritedRoles" : [ ]
}
{
"role" : "clusterAdmin",
"db" : "admin",
"isBuiltin" : true,
"roles" : [ ],
"inheritedRoles" : [ ]
}
{
"role" : "clusterManager",
"db" : "admin",
"isBuiltin" : true,
"roles" : [ ],
"inheritedRoles" : [ ]
}
{
"role" : "clusterMonitor",
"db" : "admin",
"isBuiltin" : true,
"roles" : [ ],
"inheritedRoles" : [ ]
}
{
"role" : "dbAdmin",
"db" : "admin",
"isBuiltin" : true,
"roles" : [ ],
"inheritedRoles" : [ ]
}
{
"role" : "dbAdminAnyDatabase",
"db" : "admin",
"isBuiltin" : true,
"roles" : [ ],
"inheritedRoles" : [ ]
}
{
"role" : "dbOwner",
"db" : "admin",
"isBuiltin" : true,
"roles" : [ ],
"inheritedRoles" : [ ]
}
{
"role" : "enableSharding",
"db" : "admin",
"isBuiltin" : true,
"roles" : [ ],
"inheritedRoles" : [ ]
}
{
"role" : "hostManager",
"db" : "admin",
"isBuiltin" : true,
"roles" : [ ],
"inheritedRoles" : [ ]
}
{
"role" : "read",
"db" : "admin",
"isBuiltin" : true,
"roles" : [ ],
"inheritedRoles" : [ ]
}
{
"role" : "readAnyDatabase",
"db" : "admin",
"isBuiltin" : true,
"roles" : [ ],
"inheritedRoles" : [ ]
}
{
"role" : "readWrite",
"db" : "admin",
"isBuiltin" : true,
"roles" : [ ],
"inheritedRoles" : [ ]
}
{
"role" : "readWriteAnyDatabase",
"db" : "admin",
"isBuiltin" : true,
"roles" : [ ],
"inheritedRoles" : [ ]
}
{
"role" : "restore",
"db" : "admin",
"isBuiltin" : true,
"roles" : [ ],
"inheritedRoles" : [ ]
}
{
"role" : "root",
"db" : "admin",
"isBuiltin" : true,
"roles" : [ ],
"inheritedRoles" : [ ]
}
{
"role" : "userAdmin",
"db" : "admin",
"isBuiltin" : true,
"roles" : [ ],
"inheritedRoles" : [ ]
}
{
"role" : "userAdminAnyDatabase",
"db" : "admin",
"isBuiltin" : true,
"roles" : [ ],
"inheritedRoles" : [ ]
}

查看当前数据库,直接使用 db 命令。

> db
test

用户授权

// 创建数据库:
use test
db.customer.insert({id: 1, memo: "create database", cdate: new Date()})

// 创建用户(读写权限):
> use admin
> db.createUser({user: "readerwriter", pwd: "writer123", roles: [{role: "readWrite", db: "test"}]});
Successfully added user: {
"user" : "readerwriter",
"roles" : [
{
"role" : "readWrite",
"db" : "test"
}
]
}

// 创建用户(对 test 库有只读权限):
> use admin
> db.createUser({user: "reader", pwd: "reader123", roles: [{role: "read", db: "test"}]})
Successfully added user: {
"user" : "reader",
"roles" : [
{
"role" : "read",
"db" : "test"
}
]
}

我们退出当前 mongo shell,然后以 reader 用户登录到 MongoDB 中,

> exit
bye

[root@mongo01 ~]# mongo --authenticationDatabase "admin" -u "reader" -p
MongoDB shell version v4.4.15
Enter password:
connecting to: mongodb://127.0.0.1:27017/?authSource=admin&compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("4fc423cf-d502-4511-bc2f-fdb4d452b45d") }
MongoDB server version: 4.4.15
> show dbs
test 0.000GB

> show tables
customer
inventory
oscars

接着我们插入一条数据进行验证:

> db.customer.insert({id: 2, "memo": "i can insert doc?", "cdate": new Date()})
WriteCommandError({
"ok" : 0,
"errmsg" : "not authorized on test to execute command { insert: \"customer\", ordered: true, lsid: { id: UUID(\"4fc423cf-d502-4511-bc2f-fdb4d452b45d\") }, $db: \"test\" }",
"code" : 13,
"codeName" : "Unauthorized"
})

接着我们验证 readerwriter 用户,

> exit
bye

[root@mongo01 ~]# mongo --authenticationDatabase "admin" -u "readerwriter" -p
MongoDB shell version v4.4.15
Enter password:
connecting to: mongodb://127.0.0.1:27017/?authSource=admin&compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("46071731-410c-4b26-a3f7-b5ef36186e21") }
MongoDB server version: 4.4.15
> show dbs
test 0.000GB

> use test
switched to db test

> show tables
customer
inventory
oscars

// 插入一条文档
> db.customer.insert({id: 2, "memo": "i can insert doc?", "cdate": new Date()})
WriteResult({ "nInserted" : 1 })

// 查看文档
> db.customer.find().pretty()
{
"_id" : ObjectId("62e76836e62e3a8595db3642"),
"id" : 1,
"memo" : "create database",
"cdate" : ISODate("2022-08-01T05:44:22.024Z")
}
{
"_id" : ObjectId("62e76b041abf99a6e2870558"),
"id" : 2,
"memo" : "i can insert doc?",
"cdate" : ISODate("2022-08-01T05:56:20.410Z")
}

// 删除一条文档
> db.customer.deleteOne({id: 2})
{ "acknowledged" : true, "deletedCount" : 1 }

> db.customer.find().pretty()
{
"_id" : ObjectId("62e76836e62e3a8595db3642"),
"id" : 1,
"memo" : "create database",
"cdate" : ISODate("2022-08-01T05:44:22.024Z")
}

删除用户

> use admin
switched to db admin

> db.runCommand({dropUser: "reader"})
{ "ok" : 1 }

总结

好了,今天就为大家介绍这么多。主要是 MongoDB 的一些安装配置及基本操作、介绍了图形化管理工具、远程连接、简单的用户授权等。后面的章节会继续为大家介绍相关的其他话题,请大家继续关注,别走开。

责任编辑:武晓燕 来源: 新钛云服
相关推荐

2023-03-30 08:01:59

2023-02-14 08:01:32

2023-01-31 08:03:32

部署mongod配置

2022-11-16 08:00:37

MongoDB阿里云的登录

2011-03-08 10:27:25

MongoDB介绍安装

2017-09-08 14:30:33

MongoDB安装操作命令

2024-08-21 08:02:47

2019-10-11 10:52:42

Web架构MongoDB

2022-06-21 14:02:29

MongoDB数据库存储

2021-09-24 14:02:53

性能优化实践

2022-05-02 15:11:15

Bytedoc云原生数据库服务

2011-01-10 11:09:16

linuxMongoDB安装

2024-04-18 10:48:24

MongoDB

2013-03-19 09:27:37

MongoDB

2014-03-28 09:35:11

MongoDBSharding

2015-03-09 10:58:01

MongodbMySQL

2012-04-19 10:04:20

ibmdw

2021-07-27 05:05:46

MongoDB存储Hangfire

2011-06-09 12:56:31

MongoDB

2015-07-20 16:47:22

MongoDB
点赞
收藏

51CTO技术栈公众号