MongoDB官网入门指南

MongoDB官网入门指南

Reference: https://docs.mongodb.com/guides/

保护你部署的 MongoDB

介绍如何在本地 MongDB 部署中使用强制认证

1.通过 mongo shell 连接到 MongoDB 服务端

mongo --host <HOSTNAME> --port <PORT> # 默认端口 27017

2.切换到 admin 数据库

use admin

3.创建一个 root 用户,root 用户拥有所有字段的特权。

db.createUser({user: "Harry", pwd: "admin", roles: ["root"]})

4.验证刚刚创建的用户

show users
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
"_id": "admin.Harry",
"userId" : UUID("a1b0cbcc-54bf-4169-9e76-b2c011a14a68"),
"user": "Harry",
"db": "admin",
"roles": [
{
"role": "root",
"db": "admin"
}
],
"mechanisms": [
"SCRAM-SHA-1",
"SCRAM-SHA-256"
]
}

5.关闭 mongoDB 实例

db.shutdownServer()

6.以访问控制重启 MongoDB 实例,携带 --auth 参数启动 mongod 进程。如果在 mongoDB 部署中使用默认的数据存储目录(/data/db),就不需要携带 --dbpath 参数。

mongod --dbpath <path to data directory> --auth
--------------------------
如果使用 docker,启动命令是:
docker run -d -p 27017:27017 mongo --auth

连接 MongoDB

有以下几种方式连接到 MongoDB 实例:

  1. MongoDB Compass:一个可供用户下载的访问界面
  2. mongo:交互式终端
  3. programmatic access:应用程序API

以 mongo shell 连接方式为例,介绍 mongo shell 的连接 URL 规则

现在,假设你已经创建了一个拥有 readWriteAnyDatabase 角色的用户,可以通过以下 url 连接:

1.连接本地 mongodb 实例

# authSource:指定数据库名关联的用户凭证,填用户认证的数据库即可。(如:Harry 用户是在 admin 数据库中创建的)
mongo mongodb://localhost:27017/[database]?authSource=$[authSource] --username Harry

2.连接本地 mongodb 副本集

mongo mongodb://localhost:27017/[database]?replicaSet=$[replicaSet],authSource=$[authSource],ssl=true --username Harry --password

插入数据

1.连接 MongoDB 实例

mongo mongodb://localhost:27017/admin?authSource=admin --username Harry

2.切换到 test 数据库

use test

3.插入单个文档,mongodb 存储的文档称之为 BSON,文档存储到 collections 中。以下命令将插入一个新文档到 inventory 集合中,如果文档没有指定 _id 字段,mongodb 会默认添加一个 _id 字段到新文档。

db.[collection].insertOne({})

1
2
3
4
5
6
7
8
> use test
switched to db test
> db.inventory.insertOne({"item": "cavas", "qty": 100, "tags": ["cotton"], "size": {"h": 28, "w": 35.5, "uom": "cm"}})
# 结果
{
"acknowledged" : true,
"insertedId" : ObjectId("5e71fd91711440af16731077")
}

mongoDB 不像 SQL 表,MongoDB 集合有动态 schema,单个集合可以存储不同形状的文档(包含不同的字段和值类型),直接更新文档即可。

从 MongoDB 读取数据

1.检索 inventory 集合中的所有文档

db.[collection].find({})

1
2
3
# 在 mongo shell 中不需要使用游标,因为返回的结果最多 20 条
> myCursor = db.inventory.find({})
{ "_id" : ObjectId("5e71fd91711440af16731077"), "item" : "cavas", "qty" : 100, "tags" : [ "cotton" ], "size" : { "h" : 28, "w" : 35.5, "uom" : "cm" } }

使用查询从 MongoDB 读取数据

1.先批量插入数据便于后续查询

db.[collection].insertMany({})

1
2
3
4
5
6
7
db.inventory.insertMany( [
{ "item": "journal", "qty": 25, "size": { "h": 14, "w": 21, "uom": "cm" }, "status": "A" },
{ "item": "notebook", "qty": 50, "size": { "h": 8.5, "w": 11, "uom": "in" }, "status": "A" },
{ "item": "paper", "qty": 100, "size": { "h": 8.5, "w": 11, "uom": "in" }, "status": "D" },
{ "item": "planner", "qty": 75, "size": { "h": 22.85, "w": 30, "uom": "cm" }, "status": "D" },
{ "item": "postcard", "qty": 45, "size": { "h": 10, "w": 15.25, "uom": "cm" }, "status": "A" }
]);

2.查询集合中的指定文档,以下实例中以 status=D 作为缩小范围的标准在集合中查询:

1
2
3
4
myCursor = db.inventory.find({status: "D"})
-------- 输出
{ "_id" : ObjectId("5e7204bf711440af1673107a"), "item" : "paper", "qty" : 100, "size" : { "h" : 8.5, "w" : 11, "uom" : "in" }, "status" : "D" }
{ "_id" : ObjectId("5e7204bf711440af1673107b"), "item" : "planner", "qty" : 75, "size" : { "h" : 22.85, "w" : 30, "uom" : "cm" }, "status" : "D" }

3.根据指定的文档内容来查询文档,如:以 size 字段的值等于 { h: 14, w: 21, uom: “cm” } 作为条件来查询文档。

myCursor = db.inventory.find( { size: { h: 14, w: 21, uom: "cm" } } )

4.使用点号,指定JSON对象的属性以及内嵌属性来查询数据

myCursor = db.inventory.find( { "size.uom": "in" } )

使用运算符和复合查询读取数据

使用内嵌属性和比较运算符读取数据

1.使用 less than 操作符,以下查询将从 inventory 集合中,查找 size 属性的内嵌属性 h 小于 15 的所有文档:

db.inventory.find({"size.h": {$lt: 15}})

使用复合查询读取数据

1.查询 inventory 集合中所有的状态等于A,并且 qty 小于 30 的文档:

> db.inventory.find({ 'status':'A', qty:{$lt: 30} })

2.查询 inventory 集合中所有的状态等于A,并且 size 属性的内嵌属性 h 小于 15 的所有文档:

> db.inventory.find({"size.h": {$lt: 15}, "status": "D"})

3.查询 2 其实已经隐式包含了一个查询条件 and:

> db.inventory.find({ $and: [ {'status':'A'}, {qty:{$lt: 30}} ] })

4.2.查询 inventory 集合中所有的状态等于A,或者 size 属性的内嵌属性 h 小于 15 的所有文档:

> db.inventory.find({ $or: [{'status':'A'}, {qty:{$lt: 30}}] })

使用一个或多个复合查询读取数据

1.以下案例查询 inventory 集合中的所有文档,条件是:「状态为A」和「要么qty小于30,要么item的第一个字母以p打头」。

> db.inventory.find({ status: 'A', $or: [{qty: {$lt: 30}}, {item: /^p/}] })

在 MongoDB 中更新数据

更新单个文档

MongoDB 提供更新操作修改字段值,当要更新的某些字段不存在时,会创建一个字段。

以下命令会更新 item = paper 的第一个文档,具体使用:

  • $set:更新 status 属性和 size 属性的内嵌属性 uom;
  • $currentDate:设置一个当前时间到这个字段。
1
2
3
4
5
6
7
> db.inventory.updateOne(
{'item': 'paper'}, // 相当于查询条件,但是是第一个匹配的条件。
{
$set: {'size.uom': 'cm', 'status': 'p'},
$currentDate: {'lastModifield': true}
}
)

更新多个文档

以下命令会更新集合中所有 qty 小于 50 的文档:

1
2
3
4
5
6
7
> db.inventory.updateMany(
{'qty': {$lt: 50}}, // 查询条件:qty 小于 50 的所有匹配记录。
{
$set: {'size.uom': 'cm', 'status': 'P'},
$currentDate: {'lastModifield': true}
}
)

这个命令会返回一个 WriteResult 的文档,其包含了执行状态:

1
{ "acknowledged" : true, "matchedCount" : 2, "modifiedCount" : 2 }

从 MongoDB 删除数据

删除单条数据

以下命令会删除 inventory 集合中状态为 D 的第一个文档:

> db.inventory.deleteOne({ 'status': 'D' })

此操作会返回一个记录操作结果的文档:

{ "acknowledged" : true, "deletedCount" : 1 }

删除多条数据

以下命令会删除 inventory 集合中状态为 P 的所有文档:

> db.inventory.deleteMany({ 'status': 'P' })

此操作会返回一个记录操作结果的文档:

{ "acknowledged" : true, "deletedCount" : 2 }

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×