diff --git a/README.md b/README.md
index 75ea087..794ff35 100644
--- a/README.md
+++ b/README.md
@@ -54,10 +54,11 @@ TODO
#### 4.MongoDB
-+ MongoDB 简介及基本原理
-+ MongoDB数据类型分析
-+ MongoDB 聚合、索引及基本执行命令
-+ MongoDB数据分片、转存及恢复策略
++ [MongoDB 基础](https://github.com/heibaiying/Full-Stack-Notes/blob/master/notes/MongoDB_基础.md)
++ [MongoDB 索引](https://github.com/heibaiying/Full-Stack-Notes/blob/master/notes/MongoDB_索引.md)
++ [MongoDB 聚合](https://github.com/heibaiying/Full-Stack-Notes/blob/master/notes/MongoDB_聚合.md)
++ [MongoDB 复制](https://github.com/heibaiying/Full-Stack-Notes/blob/master/notes/MongoDB_复制.md)
++ [MongoDB 分片](https://github.com/heibaiying/Full-Stack-Notes/blob/master/notes/MongoDB_分片.md)
diff --git a/notes/Docker基础.md b/notes/Docker_基础.md
similarity index 100%
rename from notes/Docker基础.md
rename to notes/Docker_基础.md
diff --git a/notes/Java单例设计模式详解.md b/notes/Java_单例设计模式详解.md
similarity index 100%
rename from notes/Java单例设计模式详解.md
rename to notes/Java_单例设计模式详解.md
diff --git a/notes/Java反射.md b/notes/Java_反射.md
similarity index 100%
rename from notes/Java反射.md
rename to notes/Java_反射.md
diff --git a/notes/Java并发.md b/notes/Java_并发.md
similarity index 100%
rename from notes/Java并发.md
rename to notes/Java_并发.md
diff --git a/notes/Linux常用Shell命令.md b/notes/Linux_常用Shell命令.md
similarity index 100%
rename from notes/Linux常用Shell命令.md
rename to notes/Linux_常用Shell命令.md
diff --git a/notes/MongoDB_基础.md b/notes/MongoDB_基础.md
index b23c81b..92a4885 100644
--- a/notes/MongoDB_基础.md
+++ b/notes/MongoDB_基础.md
@@ -1,5 +1,22 @@
# MongoDB 基础
+
+
## 一、数据类型
### 1.1 BSON
@@ -56,7 +73,7 @@ db.collection.insertMany()
新增单条数据的示例如下。额外需要说明的是,在插入文档前,文档所属的集合不必预先创建,程序会自动创建:
-```json
+```shell
db.user.insertOne({
name: "heibai",
age: 26,
@@ -68,7 +85,7 @@ db.user.insertOne({
新增多条数据的示例如下:
-```json
+```shell
db.user.insertMany([
{
name: "hei",
@@ -109,7 +126,7 @@ db.collection.find(, )
+ ``:用于指定查询条件,不加任何条件则默认查询集合中全部数据;
+ ``:可选操作,用于自定查询的返回字段,1 表示该字段包含在返回结果中,0 表示不返回,示例如下:
-```json
+```shell
db.user.find({},{name: 1, ObjectId:-1})}
```
@@ -123,19 +140,19 @@ db.user.find({name:"heibai"})
上面的语法实际上是 `$eq` 操作的简写形式,如下:
-```json
+```shell
db.user.find({name: {$eq: "heibai"}})
```
所以如果你想要进行非等值查询,则可以使用 `$ne` 操作符,代表 not equal ,示例如下:
-```json
+```shell
db.user.find({name: {$ne: "heibai"}})
```
特别的,如果你想允许某个字段等于多个值,可以使用 `$in` 操作符,示例如下:
-```json
+```shell
db.user.find({name: {$in:["heibai","ying"]} })
```
@@ -143,7 +160,7 @@ db.user.find({name: {$in:["heibai","ying"]} })
Mongodb 提供了比较操作符 `$lt`、`$lte`、`$gt` 和 `$gte` ,分别对应 <、 <=、 >和 >= ,主要用于范围查查询,示例如下:
-```json
+```shell
db.user.find({age: {$gt: 20, $lt: 40}})
```
@@ -153,18 +170,18 @@ Mongodb 提供了逻辑操作符 `$or`、`$and`、`$not`、`$nor` ,用于处
查询姓名为 heibai 或者年龄大于 30 岁的所有用户,此时可以使用 $or 操作符:
-```json
+```shell
db.user.find( { $or: [{ name: "heibai" }, { age: { $gt: 30 } }] })
```
查询所有姓名不是以 hei 开头的所有用户,此时可以使用 $not 操作符来配合正则表达式:
-```json
+```shell
db.user.find({name: {$not: /^hei*/}})
```
如果文档中存在 name 字段,则它的值不能为 heibai,如果文档中存在 age 字段,则它的值不能大于 30 ,只有满足以上两个条件的文档才会被查询出来,示例如下:
-```json
+```shell
db.user.find( { $nor: [{ name: "heibai" }, { age: { $gt: 30 } }] })
```
@@ -174,22 +191,22 @@ $and 操作符的使用率比较低,因为此时更好的方式是把多个条
如果需要查询个人爱好中有 football 的所有用户,即只要集合 Hobby 中存在 football 即可,对应的查询方法如下:
-```json
+```shell
db.user.find({Hobby: "football"})
```
如果想要获取集合中指定位置等于指定值的文档,对应的查询方法如下:
-```json
+```shell
db.user.find({"Hobby.2": "football"})
```
如果想要约束集合必须包含多个指定值,此时可以使用 $all 操作符:
-```json
+```shell
db.user.find({Hobby:{ $all: ["football", "tennis"]}})
```
查询时如果只想返回集合的部分内容,则可以使用 $slice ,$slice 接收一个参数 n,正数表示获取集合的前 n 个参数,负数表示获取集合末尾的 n 个参数,示例如下:
-```json
+```shell
db.user.find({name: "heibai"},{Hobby:{$slice: 2}})
```
@@ -220,7 +237,7 @@ db.collection.updateMany(, , )
+ ``:更改操作或新文档数据;
+ ` `:可选操作,常用的可选操作是 `upsert` ,当其为 true 时,代表如果按照过滤条件没有找到对应的文档,则将待更改的数据插入到集合中;当其为 false 时,如果没有找到数据,则不执行任何操作。示例如下:
-```json
+```shell
db.user.replaceOne(
{ _id: ObjectId("5d3d00a4ad383d3becc7b03a")},
{
@@ -242,7 +259,7 @@ db.user.replaceOne(
用于修改具体的字段,如果待修改的字段不存在,则会新增该字段。示例如下:
-```json
+```shell
db.user.updateOne(
{ name: "danrenying"},
{ $set: {age: 66} }
@@ -253,7 +270,7 @@ db.user.updateOne(
用于对指定字段的值进行增加或减少,示例如下:
-```json
+```shell
db.user.updateOne(
{ name: "danrenying"},
{ $inc: {age: -10} }
@@ -268,7 +285,7 @@ db.user.updateOne(
用于往数组中新增数据,示例如下。使用 `$each` 可以一次添加多个元素:
-```json
+```shell
db.user.updateOne(
{ name: "danrenying"},
{ $push: {"Hobby": {$each: ["film","music"]}} }
@@ -279,7 +296,7 @@ db.user.updateOne(
该修改器可以把数组当做集 (set) 来使用,即只能添加当前数组中不存在的数据,示例如下:
-```json
+```shell
db.user.updateOne(
{ name: "danrenying"},
{ $addToSet: {"Hobby": {$each: ["film","music"]}} }
@@ -290,7 +307,7 @@ db.user.updateOne(
该修改器可以从数组任意一端删除元素,`-1` 代表从数组头删除元素,`1` 代表从数组尾删除元素,示例如下:
-```json
+```shell
db.user.updateOne(
{ name: "danrenying"},
{ $pop: {"Hobby": -1} }
@@ -319,7 +336,7 @@ db.collection.deleteOne()
使用示例如下:
-```json
+```shell
db.user.deleteOne(
{ name: "danrenying"}
)
diff --git a/notes/MongoDB_索引.md b/notes/MongoDB_索引.md
index b3b2b21..060c0de 100644
--- a/notes/MongoDB_索引.md
+++ b/notes/MongoDB_索引.md
@@ -1,5 +1,27 @@
# MongoDB 索引
+
+
## 一、索引简介
### 1.1 创建索引
@@ -90,8 +112,7 @@ db.user.find({}).sort({name:1})
当前大多数数据库都支持双向遍历索引,这和存储结构有关 (如下图)。在 B-Tree 结构的叶子节点上,存储了索引键的值及其对应文档的位置信息,而每个叶子节点间则类似于双向链表,所以如下图既可以从值为 4 的索引遍历到值为 92 的索引,反之亦然。
-
-
+
### 2.2 复合索引
@@ -104,7 +125,7 @@ db.user.createIndex( { name: -1,birthday: 1} )
需要注意的是 MongoDB 的复合索引具备前缀索引的特征,即如果你创建了索引 `{ a:1, b: 1, c: 1, d: 1 }`,那么等价于在该集合上,还存在了以下三个索引,这三个隐式索引同样可以用于优化查询和排序操作:
-```json
+```shell
{ a: 1 }
{ a: 1, b: 1 }
{ a: 1, b: 1, c: 1 }
diff --git a/notes/MongoDB_聚合.md b/notes/MongoDB_聚合.md
index 342b9a5..4485248 100644
--- a/notes/MongoDB_聚合.md
+++ b/notes/MongoDB_聚合.md
@@ -1,5 +1,22 @@
# MongoDB 聚合操作
+
+
## 一、聚合简述
在日常开发中,我们通常需要对存储数据进行聚合分析后,再返回给客户端。MongoDB提供了三种聚合的方式,分别是聚合管道,map-reduce 函数和单用途聚合方法。
@@ -59,7 +76,7 @@ db.employees.aggregate([
所以最后的输出结果如下:
-```json
+```shell
{
"_id" : ObjectId("5d3fe6488ba16934ccce999d"),
"fullName" : "GeorgiFacello"
@@ -70,7 +87,7 @@ db.employees.aggregate([
}
```
-在当前最新的 MongoDB 4.x 中,MongoDB 提供了将近 30 个管道阶段,用于满足不同数据处理的需求。以下主要介绍常用几个管道阶段,如果想要了解全部的管道阶段,可以参见官方文档:[Aggregation Pipeline Stages](https://docs.mongodb.com/manual/reference/operator/aggregation-pipeline/)
+在当前最新的 MongoDB 4.x 中,MongoDB 提供了将近 30 个管道阶段,用于满足不同数据处理的需求。以下主要介绍常用几个管道阶段,如果想要了解全部的管道阶段,可以参见官方文档:[Aggregation Pipeline Stages](https://docs.mongodb.com/manual/reference/operator/aggregation-pipeline/) 。
### 1.1 $match
@@ -117,13 +134,13 @@ db.employees.aggregate([
])
```
-这里判断当文档的 hobby 属性为空数组时,则其 hobby 属性不会被输出到下一个管道阶段。
+这里判断当文档的 hobby 属性为空数组时,其 hobby 属性不会被输出到下一个管道阶段。
### 1.3 $group
$group 管道阶段和大多数关系型数据库中的 group by 字句功能类似,都是用于分组计算。示例如下:
-```json
+```shell
db.employees.aggregate(
[
{ $group : {
@@ -199,7 +216,7 @@ $unwind 将文档按照数组中的每一个元素进行拆分,类似于大多
+ **preserveNullAndEmptyArrays**:如果用于展开的字段值为 null 或空数组时,则对应的文档不会被输出到下一阶段。如果想要输出到下一阶段则需要将该属性设置为 true。示例语句如下:
-```json
+```shell
db.employees.aggregate( [
{$project: {_id: 0, emp_no: 1, hobby:1}},
{ $unwind:
@@ -228,7 +245,7 @@ db.employees.aggregate( [
### 1.5 $sort
-$sort 主要用于排序操作,需要注意的是如果可以,应当尽量将该操作放置在管道的第一阶段,从而可以利用索引进行排序,否则就需要使用内存进行排序,这时排序操作就会变得相当昂贵,需要额外的内存和计算资源的开销。
+$sort 主要用于排序操作,需要注意的是如果可以,应当尽量将该操作放置在管道的第一阶段,从而可以利用索引进行排序,否则就需要使用内存进行排序,这时排序操作就会变得相当昂贵,需要额外消耗内存和计算资源。
示例如下:
@@ -250,6 +267,29 @@ db.employees.aggregate([
### 1.8 $lookup
+#### 1. 关联查询
+
+$lookup 类似与大多数关系型数据库中的 left outer join ,用于实现不同集合之间的连接。其基本的语法如下:
+
+```shell
+{
+ $lookup:
+ {
+ from: ,
+ localField: ,
+ foreignField: ,
+ as: