Skip to content

Commit 5a85d01

Browse files
committed
update docs
1 parent 093e96c commit 5a85d01

11 files changed

+344
-23
lines changed
Binary file not shown.

assets/数据库技术鸟瞰.xmind

754 KB
Binary file not shown.

docs/nosql/mongodb/README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010

1111
### [MongoDB 应用指南](mongodb-quickstart.md)
1212

13+
### [MongoDB CRUD 操作](mongodb-crud.md)
14+
1315
### [MongoDB 聚合操作](mongodb-aggregation.md)
1416

1517
### [MongoDB 建模](mongodb-model.md)
@@ -28,7 +30,7 @@
2830

2931
- **官方**
3032
- [MongoDB 官网](https://www.mongodb.com/)
31-
- [MongoDBGithub](https://github.com/mongodb/mongo)
33+
- [MongoDB Github](https://github.com/mongodb/mongo)
3234
- [MongoDB 官方免费教程](https://university.mongodb.com/)
3335
- **教程**
3436
- [MongoDB 教程](https://www.runoob.com/mongodb/mongodb-tutorial.html)

docs/nosql/mongodb/mongodb-aggregation.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -377,7 +377,7 @@ SQL 和 MongoDB 聚合方式对比:
377377

378378
- **官方**
379379
- [MongoDB 官网](https://www.mongodb.com/)
380-
- [MongoDBGithub](https://github.com/mongodb/mongo)
380+
- [MongoDB Github](https://github.com/mongodb/mongo)
381381
- [MongoDB 官方免费教程](https://university.mongodb.com/)
382382
- **教程**
383383
- [MongoDB 教程](https://www.runoob.com/mongodb/mongodb-tutorial.html)

docs/nosql/mongodb/mongodb-crud.md

Lines changed: 320 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,320 @@
1+
# MongoDB CRUD 操作
2+
3+
<!-- TOC depthFrom:2 depthTo:3 -->
4+
5+
<!-- /TOC -->
6+
7+
## 一、基本 CRUD 操作
8+
9+
MongoDB 的 CRUD 操作是针对 document 的读写操作。
10+
11+
### Create 操作
12+
13+
MongoDB 提供以下操作向一个 collection 插入 document
14+
15+
- [`db.collection.insertOne()`](https://docs.mongodb.com/manual/reference/method/db.collection.insertOne/#db.collection.insertOne):插入一条 document
16+
- [`db.collection.insertMany()`](https://docs.mongodb.com/manual/reference/method/db.collection.insertMany/#db.collection.insertMany):插入多条 document
17+
18+
> 注:以上操作都是原子操作。
19+
20+
![](https://raw.githubusercontent.com/dunwu/images/dev/snap/20200924112342.svg)
21+
22+
插入操作的特性:
23+
24+
- MongoDB 中的所有写操作都是单个文档级别的原子操作。
25+
- 如果要插入的 collection 当前不存在,则插入操作会自动创建 collection。
26+
- 在 MongoDB 中,存储在集合中的每个文档都需要一个唯一的 [`_id`](https://docs.mongodb.com/manual/reference/glossary/#term-id) 字段作为主键。如果插入的文档省略 `_id` 字段,则 MongoDB 驱动程序会自动为 `_id` 字段生成 ObjectId。
27+
- 可以 MongoDB 写入操作的确认级别来控制写入行为。
28+
29+
【示例】插入一条 document 示例
30+
31+
```javascript
32+
db.inventory.insertOne({
33+
item: 'canvas',
34+
qty: 100,
35+
tags: ['cotton'],
36+
size: { h: 28, w: 35.5, uom: 'cm' },
37+
})
38+
```
39+
40+
【示例】插入多条 document 示例
41+
42+
```javascript
43+
db.inventory.insertMany([
44+
{
45+
item: 'journal',
46+
qty: 25,
47+
tags: ['blank', 'red'],
48+
size: { h: 14, w: 21, uom: 'cm' },
49+
},
50+
{
51+
item: 'mat',
52+
qty: 85,
53+
tags: ['gray'],
54+
size: { h: 27.9, w: 35.5, uom: 'cm' },
55+
},
56+
{
57+
item: 'mousepad',
58+
qty: 25,
59+
tags: ['gel', 'blue'],
60+
size: { h: 19, w: 22.85, uom: 'cm' },
61+
},
62+
])
63+
```
64+
65+
### Read 操作
66+
67+
MongoDB 提供 [`db.collection.find()`](https://docs.mongodb.com/manual/reference/method/db.collection.find/#db.collection.find) 方法来检索 document。
68+
69+
![](https://raw.githubusercontent.com/dunwu/images/dev/snap/20200924113832.svg)
70+
71+
### Update 操作
72+
73+
MongoDB 提供以下操作来更新 collection 中的 document
74+
75+
- [`db.collection.updateOne()`](https://docs.mongodb.com/manual/reference/method/db.collection.updateOne/#db.collection.updateOne):更新一条 document
76+
- [`db.collection.updateMany()`](https://docs.mongodb.com/manual/reference/method/db.collection.updateMany/#db.collection.updateMany):更新多条 document
77+
- [`db.collection.replaceOne()`](https://docs.mongodb.com/manual/reference/method/db.collection.replaceOne/#db.collection.replaceOne):替换一条 document
78+
79+
语法格式:
80+
81+
- [`db.collection.updateOne(<filter>, <update>, <options>)`](https://docs.mongodb.com/manual/reference/method/db.collection.updateOne/#db.collection.updateOne)
82+
- [`db.collection.updateMany(<filter>, <update>, <options>)`](https://docs.mongodb.com/manual/reference/method/db.collection.updateMany/#db.collection.updateMany)
83+
- [`db.collection.replaceOne(<filter>, <update>, <options>)`](https://docs.mongodb.com/manual/reference/method/db.collection.replaceOne/#db.collection.replaceOne)
84+
85+
![](https://raw.githubusercontent.com/dunwu/images/dev/snap/20200924114043.svg)
86+
87+
【示例】插入测试数据
88+
89+
```javascript
90+
db.inventory.insertMany([
91+
{
92+
item: 'canvas',
93+
qty: 100,
94+
size: { h: 28, w: 35.5, uom: 'cm' },
95+
status: 'A',
96+
},
97+
{ item: 'journal', qty: 25, size: { h: 14, w: 21, uom: 'cm' }, status: 'A' },
98+
{ item: 'mat', qty: 85, size: { h: 27.9, w: 35.5, uom: 'cm' }, status: 'A' },
99+
{
100+
item: 'mousepad',
101+
qty: 25,
102+
size: { h: 19, w: 22.85, uom: 'cm' },
103+
status: 'P',
104+
},
105+
{
106+
item: 'notebook',
107+
qty: 50,
108+
size: { h: 8.5, w: 11, uom: 'in' },
109+
status: 'P',
110+
},
111+
{ item: 'paper', qty: 100, size: { h: 8.5, w: 11, uom: 'in' }, status: 'D' },
112+
{
113+
item: 'planner',
114+
qty: 75,
115+
size: { h: 22.85, w: 30, uom: 'cm' },
116+
status: 'D',
117+
},
118+
{
119+
item: 'postcard',
120+
qty: 45,
121+
size: { h: 10, w: 15.25, uom: 'cm' },
122+
status: 'A',
123+
},
124+
{
125+
item: 'sketchbook',
126+
qty: 80,
127+
size: { h: 14, w: 21, uom: 'cm' },
128+
status: 'A',
129+
},
130+
{
131+
item: 'sketch pad',
132+
qty: 95,
133+
size: { h: 22.85, w: 30.5, uom: 'cm' },
134+
status: 'A',
135+
},
136+
])
137+
```
138+
139+
【示例】更新一条 document
140+
141+
```javascript
142+
db.inventory.updateOne(
143+
{ item: 'paper' },
144+
{
145+
$set: { 'size.uom': 'cm', status: 'P' },
146+
$currentDate: { lastModified: true },
147+
}
148+
)
149+
```
150+
151+
【示例】更新多条 document
152+
153+
```javascript
154+
db.inventory.updateMany(
155+
{ qty: { $lt: 50 } },
156+
{
157+
$set: { 'size.uom': 'in', status: 'P' },
158+
$currentDate: { lastModified: true },
159+
}
160+
)
161+
```
162+
163+
【示例】替换一条 document
164+
165+
```javascript
166+
db.inventory.replaceOne(
167+
{ item: 'paper' },
168+
{
169+
item: 'paper',
170+
instock: [
171+
{ warehouse: 'A', qty: 60 },
172+
{ warehouse: 'B', qty: 40 },
173+
],
174+
}
175+
)
176+
```
177+
178+
更新操作的特性:
179+
180+
- MongoDB 中的所有写操作都是单个文档级别的原子操作。
181+
- 一旦设置了,就无法更新或替换 [`_id`](https://docs.mongodb.com/manual/reference/glossary/#term-id) 字段。
182+
- 除以下情况外,MongoDB 会在执行写操作后保留文档字段的顺序:
183+
- `_id` 字段始终是文档中的第一个字段。
184+
- 包括重命名字段名称的更新可能导致文档中字段的重新排序。
185+
- 如果更新操作中包含 `upsert : true` 并且没有 document 匹配过滤器,MongoDB 会新插入一个 document;如果有匹配的 document,MongoDB 会修改或替换这些 document。
186+
187+
### Delete 操作
188+
189+
MongoDB 提供以下操作来删除 collection 中的 document
190+
191+
- [`db.collection.deleteOne()`](https://docs.mongodb.com/manual/reference/method/db.collection.deleteOne/#db.collection.deleteOne):删除一条 document
192+
- [`db.collection.deleteMany()`](https://docs.mongodb.com/manual/reference/method/db.collection.deleteMany/#db.collection.deleteMany):删除多条 document
193+
194+
![](https://raw.githubusercontent.com/dunwu/images/dev/snap/20200924120007.svg)
195+
196+
删除操作的特性:
197+
198+
- MongoDB 中的所有写操作都是单个文档级别的原子操作。
199+
200+
## 二、批量写操作
201+
202+
MongoDB 通过 [`db.collection.bulkWrite()`](https://docs.mongodb.com/manual/reference/method/db.collection.bulkWrite/#db.collection.bulkWrite) 方法来支持批量写操作(包括批量插入、更新、删除)。
203+
204+
此外,[`db.collection.insertMany()`](https://docs.mongodb.com/manual/reference/method/db.collection.insertMany/#db.collection.insertMany) 方法支持批量插入操作。
205+
206+
### 有序和无序的操作
207+
208+
批量写操作可以有序或无序。
209+
210+
- 对于有序列表,MongoDB 串行执行操作。如果在写操作的处理过程中发生错误,MongoDB 将不处理列表中剩余的写操作。
211+
- 对于无序列表,MongoDB 可以并行执行操作,但是不能保证此行为。如果在写操作的处理过程中发生错误,MongoDB 将继续处理列表中剩余的写操作。
212+
213+
在分片集合上执行操作的有序列表通常比执行无序列表要慢,因为对于有序列表,每个操作必须等待上一个操作完成。
214+
215+
默认情况下,[`bulkWrite()`](https://docs.mongodb.com/manual/reference/method/db.collection.bulkWrite/#db.collection.bulkWrite) 执行有序操作。要指定无序写操作,请在选项文档中设置 `ordered : false`
216+
217+
### bulkWrite() 方法
218+
219+
[`bulkWrite()`](https://docs.mongodb.com/manual/reference/method/db.collection.bulkWrite/#db.collection.bulkWrite) 支持以下写操作:
220+
221+
- [insertOne](https://docs.mongodb.com/manual/reference/method/db.collection.bulkWrite/#bulkwrite-write-operations-insertone)
222+
- [updateOne](https://docs.mongodb.com/manual/reference/method/db.collection.bulkWrite/#bulkwrite-write-operations-updateonemany)
223+
- [updateMany](https://docs.mongodb.com/manual/reference/method/db.collection.bulkWrite/#bulkwrite-write-operations-updateonemany)
224+
- [replaceOne](https://docs.mongodb.com/manual/reference/method/db.collection.bulkWrite/#bulkwrite-write-operations-replaceone)
225+
- [deleteOne](https://docs.mongodb.com/manual/reference/method/db.collection.bulkWrite/#bulkwrite-write-operations-deleteonemany)
226+
- [deleteMany](https://docs.mongodb.com/manual/reference/method/db.collection.bulkWrite/#bulkwrite-write-operations-deleteonemany)
227+
228+
【示例】批量写操作示例
229+
230+
```javascript
231+
try {
232+
db.characters.bulkWrite([
233+
{
234+
insertOne: {
235+
document: {
236+
_id: 4,
237+
char: 'Dithras',
238+
class: 'barbarian',
239+
lvl: 4,
240+
},
241+
},
242+
},
243+
{
244+
insertOne: {
245+
document: {
246+
_id: 5,
247+
char: 'Taeln',
248+
class: 'fighter',
249+
lvl: 3,
250+
},
251+
},
252+
},
253+
{
254+
updateOne: {
255+
filter: { char: 'Eldon' },
256+
update: { $set: { status: 'Critical Injury' } },
257+
},
258+
},
259+
{ deleteOne: { filter: { char: 'Brisbane' } } },
260+
{
261+
replaceOne: {
262+
filter: { char: 'Meldane' },
263+
replacement: { char: 'Tanys', class: 'oracle', lvl: 4 },
264+
},
265+
},
266+
])
267+
} catch (e) {
268+
print(e)
269+
}
270+
```
271+
272+
### 批量写操作策略
273+
274+
大量的插入操作(包括初始数据插入或常规数据导入)可能会影响分片集群的性能。对于批量插入,请考虑以下策略:
275+
276+
#### 预拆分 collection
277+
278+
如果分片集合为空,则该集合只有一个初始 [chunk](https://docs.mongodb.com/manual/reference/glossary/#term-chunk),该 [chunk](https://docs.mongodb.com/manual/reference/glossary/#term-chunk) 位于单个分片上。然后,MongoDB 必须花一些时间来接收数据,创建拆分并将拆分的块分发到可用的分片。为了避免这种性能成本,您可以按照拆分群集中的拆分块中的说明预拆分 collection。
279+
280+
#### 无序写操作
281+
282+
要提高对分片集群的写入性能,请使用 [`bulkWrite()`](https://docs.mongodb.com/manual/reference/method/db.collection.bulkWrite/#db.collection.bulkWrite),并将可选参数顺序设置为 false。[`mongos`](https://docs.mongodb.com/manual/reference/program/mongos/#bin.mongos) 可以尝试同时将写入操作发送到多个分片。对于空集合,首先按照分片群集中的分割 [chunk](https://docs.mongodb.com/manual/reference/glossary/#term-chunk) 中的说明预拆分 collection。
283+
284+
#### 避免单调节流
285+
286+
如果在一次插入操作中,分片 key 单调递增,那么所有的插入数据都会存入 collection 的最后一个 chunk,也就是存入一个分片中。因此,集群的插入容量将永远不会超过该单个分片的插入容量。
287+
288+
如果插入量大于单个分片可以处理的插入量,并且无法避免单调递增的分片键,那么请考虑对应用程序进行以下修改:
289+
290+
- 反转分片密钥的二进制位。这样可以保留信息,并避免将插入顺序与值序列的增加关联起来。
291+
- 交换第一个和最后一个 16 位字以“随机”插入。
292+
293+
## SQL 和 MongoDB 对比
294+
295+
### 术语和概念
296+
297+
| SQL 术语和概念 | MongoDB 术语和概念 |
298+
| :-------------------------- | :----------------------------------------------------------- |
299+
| database | [database](https://docs.mongodb.com/manual/reference/glossary/#term-database) |
300+
| table | [collection](https://docs.mongodb.com/manual/reference/glossary/#term-collection) |
301+
| row | [document](https://docs.mongodb.com/manual/reference/glossary/#term-document)[BSON](https://docs.mongodb.com/manual/reference/glossary/#term-bson) |
302+
| column | [field](https://docs.mongodb.com/manual/reference/glossary/#term-field) |
303+
| index | [index](https://docs.mongodb.com/manual/reference/glossary/#term-index) |
304+
| table joins | [`$lookup`](https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/#pipe._S_lookup)、嵌入式文档 |
305+
| primary key | [primary key](https://docs.mongodb.com/manual/reference/glossary/#term-primary-key)<br>MongoDB 中自动设置主键为 [`_id`](https://docs.mongodb.com/manual/reference/glossary/#term-id) 字段 |
306+
| aggregation (e.g. group by) | aggregation pipeline<br>参考 [SQL to Aggregation Mapping Chart](https://docs.mongodb.com/manual/reference/sql-aggregation-comparison/). |
307+
| SELECT INTO NEW_TABLE | [`$out`](https://docs.mongodb.com/manual/reference/operator/aggregation/out/#pipe._S_out)<br>参考 [SQL to Aggregation Mapping Chart](https://docs.mongodb.com/manual/reference/sql-aggregation-comparison/) |
308+
| MERGE INTO TABLE | [`$merge`](https://docs.mongodb.com/manual/reference/operator/aggregation/merge/#pipe._S_merge) (MongoDB 4.2 开始支持)<br>参考 [SQL to Aggregation Mapping Chart](https://docs.mongodb.com/manual/reference/sql-aggregation-comparison/). |
309+
| UNION ALL | [`$unionWith`](https://docs.mongodb.com/manual/reference/operator/aggregation/unionWith/#pipe._S_unionWith) (MongoDB 4.4 开始支持) |
310+
| transactions | [transactions](https://docs.mongodb.com/manual/core/transactions/) |
311+
312+
## 参考资料
313+
314+
- **官方**
315+
- [MongoDB 官网](https://www.mongodb.com/)
316+
- [MongoDB Github](https://github.com/mongodb/mongo)
317+
- [MongoDB 官方免费教程](https://university.mongodb.com/)
318+
- **教程**
319+
- [MongoDB 教程](https://www.runoob.com/mongodb/mongodb-tutorial.html)
320+
- [MongoDB 高手课](https://time.geekbang.org/course/intro/100040001)

docs/nosql/mongodb/mongodb-index.md

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -18,26 +18,26 @@
1818

1919
**MongoDB 使用 `createIndex()` 方法来创建索引**
2020

21-
`createIndex()` 语法如下:
21+
`createIndex()` 语法如下:
2222

2323
```javascript
2424
db.collection.createIndex( <key and index type specification>, <options> )
2525
```
2626

2727
`createIndex()` 可选参数列表如下:
2828

29-
| Parameter | Type | Description |
30-
| :----------------- | :------------ | :----------------------------------------------------------- |
31-
| background | Boolean | 建索引过程会阻塞其它数据库操作,background可指定以后台方式创建索引,即增加 "background" 可选参数。 "background" 默认值为**false**|
32-
| unique | Boolean | 建立的索引是否唯一。指定为true创建唯一索引。默认值为**false**. |
33-
| name | string | 索引的名称。如果未指定,MongoDB的通过连接索引的字段名和排序顺序生成一个索引名称。 |
34-
| dropDups | Boolean | **3.0+版本已废弃。**在建立唯一索引时是否删除重复记录,指定 true 创建唯一索引。默认值为 **false**. |
35-
| sparse | Boolean | 对文档中不存在的字段数据不启用索引;这个参数需要特别注意,如果设置为true的话,在索引字段中不会查询出不包含对应字段的文档.。默认值为 **false**. |
36-
| expireAfterSeconds | integer | 指定一个以秒为单位的数值,完成 TTL设定,设定集合的生存时间。 |
37-
| v | index version | 索引的版本号。默认的索引版本取决于mongod创建索引时运行的版本。 |
38-
| weights | document | 索引权重值,数值在 1 到 99,999 之间,表示该索引相对于其他索引字段的得分权重。 |
39-
| default_language | string | 对于文本索引,该参数决定了停用词及词干和词器的规则的列表。 默认为英语 |
40-
| language_override | string | 对于文本索引,该参数指定了包含在文档中的字段名,语言覆盖默认的language,默认值为 language. |
29+
| Parameter | Type | Description |
30+
| :----------------- | :------------ | :----------------------------------------------------------------------------------------------------------------------------------------------- |
31+
| background | Boolean | 建索引过程会阻塞其它数据库操作,background 可指定以后台方式创建索引,即增加 "background" 可选参数。 "background" 默认值为**false** |
32+
| unique | Boolean | 建立的索引是否唯一。指定为 true 创建唯一索引。默认值为**false**. |
33+
| name | string | 索引的名称。如果未指定,MongoDB 的通过连接索引的字段名和排序顺序生成一个索引名称。 |
34+
| dropDups | Boolean | **3.0+版本已废弃。**在建立唯一索引时是否删除重复记录,指定 true 创建唯一索引。默认值为 **false**. |
35+
| sparse | Boolean | 对文档中不存在的字段数据不启用索引;这个参数需要特别注意,如果设置为 true 的话,在索引字段中不会查询出不包含对应字段的文档.。默认值为 **false**. |
36+
| expireAfterSeconds | integer | 指定一个以秒为单位的数值,完成 TTL 设定,设定集合的生存时间。 |
37+
| v | index version | 索引的版本号。默认的索引版本取决于 mongod 创建索引时运行的版本。 |
38+
| weights | document | 索引权重值,数值在 1 到 99,999 之间,表示该索引相对于其他索引字段的得分权重。 |
39+
| default_language | string | 对于文本索引,该参数决定了停用词及词干和词器的规则的列表。 默认为英语 |
40+
| language_override | string | 对于文本索引,该参数指定了包含在文档中的字段名,语言覆盖默认的 language,默认值为 language. |
4141

4242
【示例】使用 name 作为索引,并且按照降序排序
4343

@@ -49,7 +49,7 @@ db.collection.createIndex( { name: -1 } )
4949

5050
- **官方**
5151
- [MongoDB 官网](https://www.mongodb.com/)
52-
- [MongoDBGithub](https://github.com/mongodb/mongo)
52+
- [MongoDB Github](https://github.com/mongodb/mongo)
5353
- [MongoDB 官方免费教程](https://university.mongodb.com/)
5454
- **教程**
5555
- [MongoDB 教程](https://www.runoob.com/mongodb/mongodb-tutorial.html)

0 commit comments

Comments
 (0)