# mongoDB

### 创建新用户
```js
// 创建用户要在当前数据库中创建，先use到那个数据库再创建用户
db.createUser(
  {
    user: "yingbo",
    pwd: "623910ert",
    roles: [ { role: "dbAdmin", db: "yingbo" },{ role: 'readWrite', db: "yingbo"} ]
  }
)

db.createUser(
  {
    user: "admin",
    pwd: "rqRrjTDaq9",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
  }
)
db.createUser(
  {
    user: "admin",
    pwd: "dY1oU0wM6yW9",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
  }
)
db.createUser(
  {
    user: "code",
    pwd: "rtRrjfSau8",
   roles: [ { role: "dbOwner", db: "code" }]
  }
)
db.createUser(
  {
    user: "coc",
    pwd: "qlSfefSor5",
   roles: [ { role: "dbOwner", db: "coc" }]
  }
)
db.createUser(
  {
    user: "apiwx",
    pwd: "srVgEGwTf4",
   roles: [ { role: "dbOwner", db: "apiwx" }]
  }
)
db.createUser(
  {
    user: "teaweb",
    pwd: "srVgEGwTf4",
   roles: [ { role: "dbOwner", db: "teaweb" }]
  }
)
db.createUser(
  {
    user: "yg",
    pwd: "zV1pL8sP4nQ1",
   roles: [ { role: "dbOwner", db: "yg" }]
  }
)
```

### log目录 `/var/log/mongodb/mongod.log`

### db目录 `/var/lib/mongo`

### 配置文件 `/etc/mongod.conf`

### 端口 12236

### 启动/重启/停止  `sudo service mongod start/restart/stop`

### 开启用户认证 conf 文件加 
```
security:
  authorization: enabled
```
### 登录
``` c
//方法一
mongo --port 12236 -u "admin" -p "rqRrjTDaq9" --authenticationDatabase "admin"
mongo --port 12236 -u "yingbo" -p "623910ert" --authenticationDatabase "yingbo"
mongo --port 12236 -u "code" -p "rtRrjfSau8" --authenticationDatabase "code"
mongo --port 12236 -u "yiban" -p "623910ert" --authenticationDatabase "yiban"
mongo --port 12236 -u "apiwx" -p "srVgEGwTf4" --authenticationDatabase "apiwx"
mongo --port 12236 -u "coc" -p "qlSfefSor5" --authenticationDatabase "coc"
mongo --port 27017 -u "yg" -p "zV1pL8sP4nQ1" --authenticationDatabase "yg"
//方法二
db.auth("yingbo", "623910ert")
db.auth("yiban", "623910ert")
db.auth("admin", "rqRrjTDaq9")
db.auth("code", "rtRrjfSau8")
db.auth("coc", "qlSfefSor5")
db.auth("apiwx", "srVgEGwTf4")
db.auth("teaweb", "srVgEGwTf4")

// pi
db.addUser('ccb', 'srVgEGwTf4')
db.addUser('coc', 'qlSfefSor5')
db.addUser('test', 'srVgEGwTf4')
db.addUser('yg', 'zV1pL8sP4nQ1')
db.auth("ccb", "srVgEGwTf4")
db.auth("test", "srVgEGwTf4")
db.auth("yg", "zV1pL8sP4nQ1")

// lacus
db.auth("admin", "dY1oU0wM6yW9")
db.auth("ccb", "wL2wG2aD6aI1")
db.auth("yg", "zV1pL8sP4nQ1")

docker exec -it 8b4f1cbbf048 mongo admin
```

### 显示所有数据库
`show dbs`

### 删库
```
use <dbname>
db.dropDatabase()
```

### 显示所有集合
`show tables` 或者 `show collections`

### 创建集合
```js
//正常情况下直接插入数据就可以自动新建一个集合

//创建固定集合 mycol，整个集合空间大小 6142800 KB, 文档最大个数为 10000 个。
db.createCollection("<collectionName>", { capped : true, autoIndexId : true, size : 
   6142800, max : 10000 } )

//单纯的新建一个集合
db.createCollection("<collectionName>")
```

### 删除集合
`db.<collectionName>.drop()`

### 增
`db.<collectionName>.insert(<object>)`

### 删
`db.<collectionName>.remove({key:value})` find里边可以为{}删除全部

### 改
```
db.<collectionName>.update(
   <query>,
   <update>,
   {
     upsert: <boolean>,
     multi: <boolean>,
     writeConcern: <document>
   }
)
/*
    query : update的查询条件，类似sql update查询内where后面的。
    update : update的对象和一些更新的操作符（如$,$inc...）等，也可以理解为sql update查询内set后面的
    upsert : 可选，这个参数的意思是，如果不存在update的记录，是否插入objNew,true为插入，默认是false，不插入。
    multi : 可选，mongodb 默认是false,只更新找到的第一条记录，如果这个参数为true,就把按条件查出来多条记录全部更新。
    writeConcern :可选，抛出异常的级别。
*/
```

### 查
`db.<collectionName>.find({key:value})` find里边可以没有参数
```
//格式化显示
db.col.find().pretty()

//条件语句
db.col.find({likes : {$lt :200, $gt : 100}}).pretty() //限制 100<likes<200

$lt:小于
$lte:小于或等于
$gt:大于
$gte:大于或等于
$ne: 不等于

$type: 
    Double 	1 	 
    String 	2 	 
    Object 	3 	 
    Array 	4 	 
    Binary data 	5 	 
    Undefined 	6 	已废弃。
    Object id 	7 	 
    Boolean 	8 	 
    Date 	9 	 
    Null 	10 	 
    Regular Expression 	11 	 
    JavaScript 	13 	 
    Symbol 	14 	 
    JavaScript (with scope) 	15 	 
    32-bit integer 	16 	 
    Timestamp 	17 	 
    64-bit integer 	18 	 
    Min key 	255 	Query with -1.
    Max key 	127

//AND
db.col.find({key1:value1, key2:value2}).pretty()

//OR
db.col.find({$or:[{"by":"菜鸟教程"},{"title": "MongoDB 教程"}]}).pretty()

//AND+OR
db.col.find({"likes": {$gt:50}, $or: [{"by": "菜鸟教程"},{"title": "MongoDB 教程"}]}).pretty()
```

---

## Limit与Skip方法

`db.<collectionName>.find().limit(<number1>).skip(<number2>)`

number1 : 本次查询最多显示条数

number2 : 本次查询跳过的条数

---

## sort() 方法

`db.<collectionName>.find().sort({<key>:<number>})`

key : 需要进行排序的键名

number : 其中 1 为升序排列，而 -1 是用于降序排列

---

## createIndex() 方法

`db.values.createIndex({<key>: <number>, <key>: <number>}, {background: true})`

key : 需要进行排序的键名

number : 其中 1 为升序排列，而 -1 是用于降序排列

建索引过程会阻塞其它数据库操作，background可指定以后台方式创建索引，即增加 "background" 可选参数。 "background" 默认值为false。

---

## aggregate() 方法

```
db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])
{
   "result" : [
      {
         "_id" : "runoob.com",
         "num_tutorial" : 2
      },
      {
         "_id" : "Neo4j",
         "num_tutorial" : 1
      }
   ],
   "ok" : 1
}
```

$sum	计算总和。	db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}])

$avg	计算平均值	db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}])

$min	获取集合中所有文档对应值得最小值。	db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}])

$max	获取集合中所有文档对应值得最大值。	db.mycol.aggregate([{$group : {_id : 
"$by_user", num_tutorial : {$max : "$likes"}}}])

$push	在结果文档中插入值到一个数组中。	db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}])

$addToSet	在结果文档中插入值到一个数组中，但不创建副本。	db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}])

$first	根据资源文档的排序获取第一个文档数据。	db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}])

$last	根据资源文档的排序获取最后一个文档数据	db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}])


## 管道

$project：修改输入文档的结构。可以用来重命名、增加或删除域，也可以用于创建计算结果以及嵌套文档。
```
结果中就只还有_id,tilte和author三个字段
db.article.aggregate(
    { $project : {
        title : 1 ,
        author : 1 ,
    }}
 );

连id一起删除
db.article.aggregate(
    { $project : {
        _id : 0 ,
        title : 1 ,
        author : 1
    }});

```


$match：用于过滤数据，只输出符合条件的文档。$match使用MongoDB的标准查询操作。
```
db.articles.aggregate( [
  { $match : { score : { $gt : 70, $lte : 90 } } },
  { $group: { _id: null, count: { $sum: 1 } } }
] );
```

$limit：用来限制MongoDB聚合管道返回的文档数。

$skip：在聚合管道中跳过指定数量的文档，并返回余下的文档。
```
db.article.aggregate(
    { $skip : 5 });
```
$unwind：将文档中的某一个数组类型字段拆分成多条，每条包含数组中的一个值。

$group：将集合中的文档分组，可用于统计结果。

$sort：将输入文档排序后输出。

$geoNear：输出接近某一地理位置的有序文档。

---

## MongoDB 复制（副本集）

等树莓派装完再看

## MongoDB 分片

等树莓派装完再看

## 备份

`mongodump -h dbhost -d dbname -o dbdirectory`


-h：
MongDB所在服务器地址，例如：127.0.0.1，当然也可以指定端口号：127.0.0.1:27017

-d：
需要备份的数据库实例，例如：test

-o：
备份的数据存放位置，例如：c:\data\dump，当然该目录需要提前建立，在备份完成后，系统自动在dump目录下建立一个test目录，这个目录里面存放该数据库实例的备份数据。 

## 恢复

`mongorestore -h <hostname><:port> -d dbname <path>`

```
--host <:port>, -h <:port>：
MongoDB所在服务器地址，默认为： localhost:27017

--db , -d ：
需要恢复的数据库实例，例如：test，当然这个名称也可以和备份时候的不一样，比如test2

--drop：
恢复的时候，先删除当前数据，然后恢复备份的数据。就是说，恢复后，备份后添加修改的数据都会被删除，慎用哦！

<path>：
mongorestore 最后的一个参数，设置备份数据所在位置，例如：c:\data\dump\test。

你不能同时指定 <path> 和 --dir 选项，--dir也可以设置备份目录。

--dir：
指定备份的目录

你不能同时指定 <path> 和 --dir 选项。
```



```
{ "_id" : ObjectId("5e4feeb072ab8a56f6efd32b"), "password" : "/3pLO7ZGxs3/aZc4c/iCOg==", "codebook" : "", "update_time" : NumberLong("1582296754436"), "mail_addr" : "531347509@qq.com", "uuid" : "2020022122523278", "active" : true }
{ "_id" : ObjectId("5e50f72c72ab8a56f5ab7f38"), "password" : "418VcZRUba306D1v+K+8ew==", "codebook" : "", "update_time" : NumberLong("1582364460140"), "mail_addr" : "1362604986@qq.com", "uuid" : "20200222174100010", "active" : true }
{ "_id" : ObjectId("5e56224272ab8a044f2a92b8"), "password" : "5iKuM+zMqbZTTB27mm9yAg==", "active" : true, "codebook" : "", "mail_addr" : "1597291489@qq.com", "update_time" : NumberLong("1582703170957"), "uuid" : "2020022615461093" }
{ "_id" : ObjectId("5e75c2b772ab8a02788d0151"), "mail_addr" : "1269149065@qq.com", "codebook" : "", "uuid" : "2020032115310340", "update_time" : NumberLong("1584775865277"), "active" : false, "password" : "NY/XYq1cZzhnkmYZ0p78SA==" }
{ "_id" : ObjectId("5e7d6ed772ab8a02788d0152"), "active" : true, "codebook" : "vD6yeixdD2VlNduZOCli9OzfOpsJL8O/cv4bsKeR7Flk5+W0KQy4oVl0iUNqtMNHSvhCeVtAO5PC1DfLbk6eTrktevo6m0Ab2H7xMlB3cRGLSyl+vohRT1jwHOb98xh97w9D34ZvLVzj/lSzFYNXG7m0JkAAq/TiTu9ZGeM1TMOIeT6j6UkoVEBG77AHHBbGPAMbE9DdaD6u31WAN2yeJQ==", "mail_addr" : "cyw13089178067@outlook.com", "password" : "u52FaDeXCxxTEJnGIJN3cA==", "update_time" : NumberLong("1585279034908"), "uuid" : "2020032711111912" }
{ "_id" : ObjectId("5e7d713772ab8a0277302540"), "mail_addr" : "cyw16089178097@outlook.com", "codebook" : "", "uuid" : "2020032711212727", "update_time" : NumberLong("1585279285143"), "active" : false, "password" : "u52FaDeXCxxTEJnGIJN3cA==" }
{ "_id" : ObjectId("5e806fb672ab8a0269b4842d"), "update_time" : NumberLong("1585475457680"), "uuid" : "2020032917515070", "password" : "Qtenmdk6Y6748iFGLucurg==", "codebook" : "", "mail_addr" : "1428255238@QQ.COM", "active" : false }
{ "_id" : ObjectId("5e4fef8572ab8a56f6efd32c"), "active" : true, "codebook" : "1aTyzjHbSCCgFvgMcufJRYA1QojFQwwuToukZ8CzcwKwyuUtZoTV5Z6YfzoDSZ2tb4uRzPnHYtrt7OJZ7IyPBOeUlfI82d52ubwes5l77tx5uT7IIBDBzuU/y2sxKf1gfZtKRGyws7iv150oCZMqwTCHmGQZ+g+gqzGP48Pwme2o3vmQF/Au+cMmv217JTymwhJmKpBS/OeYRrJOV+xmshsd2xReppKP7MjiEWIxk9OgcLPaZAjDK+LgMUAqjjjIai+eGyqRe5B4FoPtznEiSGLHeIc79nVeGPT0hrXE1pmE/lP632vk1cPP7zDmWVpRhUA2FI14IBnojc1PYv0U5A4hr22D+cRN7GPFDLzG6cmSsiEUkaVFQiP57DqmKfXdNrnH4ZNly6ZHCGb/TozPhasQB2vFjV/MM0QgUqXjMhLWUPxE/M4yYQ9dU+JBH1wS4HU973LfP90Gmyq7EY0+O3EsXv+FJKpS5fXxMxHkRJ1DWe41qXnGaUotiyngG5RSM/0cCndHbnva+Ol1YdCyWXGUjlH4vpwB+9YDMdG+aKxHWtAq6PX795OPNkjJwzu33d9xG0MVnIqJ4hTuBYt2oE+O43VvLO3x7ZaYVczXLtJarkTEXH2ZVq+tA5v1InXcai+eGyqRe5B4FoPtznEiSPEjlHINmG5px+iqcCNQOA84os4zt6mOvtR81gRZXLIxMIeYZBn6D6CrMY/jw/CZ7aje+ZAX8C75wya/bXslPKYcO0pIMACwiZpO2eHgrFrYP/QMijhDpLbjVRNzaElvBU6pfvKHWFNkHja9jkr1p2xdpXXYxVyO/eetG6uW0uThj/DY1hNWxZ/HQ+O45nHNsBeKNO+mKffvy+QHUQB2dNYL8zQYQfXUI0AJTtic8qxfcZSOUfi+nAH71gMx0b5orB5gCn53qlB/LBg7c8Jq6w7s4pJ24JqMuT7h3LmnjJtycaq+TzgAmZH7MTTkNKkO/JmmADZWJ1bdX4LCkMdAMMbnlJXyPNnedrm8HrOZe+7cebk+yCAQwc7lP8trMSn9YFNEK6CFT+ozxmrz4ksA1YpQOdsRsPPCKxmndjxJqgYY3+MQal9jtGQr9WtAGxsQV+UN/tbi5unwpmvCDDzW5fIK3NSkQta86baUZngxxqSOWx1qVQkQ0z2lWUXj7qVCh/Bpn+VNPsEGT+qSr81Hv4RrNmBwU/9Cl6ElKXSEiMhajsKVWXveUMZ+k7IRYInY3qPA/hdbwjxKfnrlsZ3wainH+uN0tUJPFp4rK2RHOhtGA7jAgt0v0t6Yws8lha8yFgTNFziJJLif+RQEHKEeb+uGxiRvs48xhggUPuFuDtUqI6xcAtIkWMMcYExxOCM6x+dbGbKFdGLri14qYeYxFPYgHJeJv0YW3+WEczmwJqWULsUR1aZVm9L3cn22881DIcCAjjlhEQb6DEFaJW5sq6lQOdsRsPPCKxmndjxJqgYY3+MQal9jtGQr9WtAGxsQV2vV4rcuuLYdsMYAKqMjAs3FmrOwbOlYL5C6xyC+EjjIjtXbnYZCa1lnflv0hvO+HMy0bvXeTJQnDU7YSssghDyAeCZYNWwe+HNT0V+h+A5fuweiJ6gvwNbhXUQpxRHzYj6nlwS5jOZwCFyu9SVAE5WBNjz+wUFLQTN9vclygiHWPKtJ+3/bmhiqQ89BoAnoLw==", "mail_addr" : "1428255238@qq.com", "password" : "Qtenmdk6Y6748iFGLucurg==", "update_time" : NumberLong("1585475735916"), "uuid" : "2020022122560528" }
{ "_id" : ObjectId("5e4fbf9f72ab8a311cf03030"), "active" : true, "codebook" : "[encoded data, 13312 characters]", "mail_addr" : "1144131090@qq.com", "password" : "hrtJQ87gz8Na7nqLTWfmQg==", "update_time" : NumberLong("1585575411354"), "uuid" : "2020022119314324" }
```