MongoDB 是一个流行的开源文档型数据库,它使用类似 JSON 的文档模型存储数据。

安装

apt-get install gnupg curl -y

curl -fsSL https://www.mongodb.org/static/pgp/server-7.0.asc | gpg -o /usr/share/keyrings/mongodb-server-7.0.gpg --dearmor
echo "deb [ signed-by=/usr/share/keyrings/mongodb-server-7.0.gpg ] http://repo.mongodb.org/apt/debian bookworm/mongodb-org/7.0 main" | tee /etc/apt/sources.list.d/mongodb-org-7.0.list
apt-get update && apt-get install mongodb-org -y

## 启动
systemctl enable --now mongod.service

连接

mongosh 是 MongoDB Shell 的交互式命令行工具,用于与 MongoDB 数据库进行交互。在上面apt install时自动安装了。

现在我们连接数据库并创建基本用户:

## 此命令相当于 mongosh --host 127.0.0.1:27017 test
mongosh

## 为test数据库创建test用户
test> db.createUser({ user: "test", pwd: passwordPrompt(), roles: [ { role: "readWrite", db: "test" }, { role: "dbAdmin", db: "test" } ] })
Enter password
**********{ ok: 1 }

## 切换至admin数据库
test> use admin
switched to db admin

## 创建root用户
admin> db.createUser({ user: "root", pwd: passwordPrompt(), roles: [ { role: "root", db: "admin" } ] })
Enter password
**********{ ok: 1 }

## 退出
admin> quit

MongoDB的权限管理比较灵活,用户是针对特定数据库创建的,role代表user所拥有哪些权限,MongoDB 内置了一些role:

  • readWrite:基本的创建、读、更新以及删除操作。
  • dbAdmin:查看数据库的状态,统计信息、锁定解锁、但没有用户和角色管理权限。
  • root:最高权限角色,拥有对数据库的完全访问权限,可以执行任何操作。

安全设置

默认情况下,MongoDB没有开启安全验证,本机可以在不验证密码的情况下以匿名方式登录任意数据库并随意创建用户,就像上面我做的那样,现在我们对/etc/mongod.conf进行设置:

# mongod.conf

# for documentation of all options, see:
#   http://docs.mongodb.org/manual/reference/configuration-options/

# Where and how to store data.
storage:
  dbPath: /var/lib/mongodb
#  engine:
#  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

#security:

#operationProfiling:

#replication:

#sharding:

## Enterprise-Only Options:

#auditLog:

security:
  authorization: "enabled"
  

设置security.authorizationenabled,通过此设置,操作数据库时必须提供身份验证,日常使用避免直接使用root用户,而应该使用普通用户进行连接操作。

在上面我们创建用户的例子中:

  • root用户拥有所有权限,主要用于创建对应数据库的用户和权限
  • test用户只对test数据库有读写权限,并且没有创建新用户权限。

如果你希望在远程任意地点访问数据库,可以设置net.bindIp0.0.0.0

Important

此时其他人任然可以以匿名方式连接数据库,匿名用户始终能够自行连接但不能执行任何操作[1]。想要阻止连接可以设置net.bindIp为信任的ip,或者保持默认值127.0.0.1只允许本机连接。

操作数据

mongosh为例:

## 连接
mongosh --host 127.0.0.1:27017 test -u test

## 插入
## 如果表没有找到将自动创建,在这个例子中为mytable
## 在MongoDB中,表被称为collection集合
test> db.mytable.insertOne({ name: "Alice", age: 25, city: "New York" });
{
  acknowledged: true,
  insertedId: ObjectId('66db1133b8c6ba9f26964033')
}

test> db.mytable.insertOne({ name: "fdxx", age: 28, city: "China" });
{
  acknowledged: true,
  insertedId: ObjectId('66db1186b8c6ba9f26964034')
}


## 查找
test> db.mytable.find({ name: "fdxx" })
[
  {
    _id: ObjectId('66db1186b8c6ba9f26964034'),
    name: 'fdxx',
    age: 28,
    city: 'China'
  }
]

test> db.mytable.find()
[
  {
    _id: ObjectId('66db1133b8c6ba9f26964033'),
    name: 'Alice',
    age: 25,
    city: 'New York'
  },
  {
    _id: ObjectId('66db1186b8c6ba9f26964034'),
    name: 'fdxx',
    age: 28,
    city: 'China'
  }
]

## 更新
test> db.mytable.updateOne({ name: "fdxx" },{ $set: { age: 18, gender: "Gunship"} })
{
  acknowledged: true,
  insertedId: null,
  matchedCount: 1,
  modifiedCount: 1,
  upsertedCount: 0
}

test> db.mytable.find({ name: "fdxx" })
[
  {
    _id: ObjectId('66db1186b8c6ba9f26964034'),
    name: 'fdxx',
    age: 18,
    city: 'China',
    gender: 'Gunship'
  }
]

## 删除
test> db.mytable.deleteOne({ name: "fdxx" })
{ acknowledged: true, deletedCount: 1 }

test> db.mytable.find()
[
  {
    _id: ObjectId('66db1133b8c6ba9f26964033'),
    name: 'Alice',
    age: 25,
    city: 'New York'
  }
]

更多操作查看官方文档


  1. disable-anonymous-access-to-mongodb ↩︎