# MongoDB
###### tags: `MongoDB`
| SQL | MongoDB | 說明 |
| -------- | -------- | -------- |
| database | database | 資料庫 |
| table | collection | 資料表 |
| row | document | 資料行 |
| column | field | 資料欄位 |
| index | index | 索引 |
| join | | MongoDB不支援join |
| primary key | primary key | 主鍵,MongoDB自動將``_id``欄位設定為主鍵 |
## 建立資料庫 or 切換至已存在的資料庫
```
use DATABASE_NAME
```
## 刪除資料庫
```
use twcode01 //移動到欲刪除的資料表
db.dropDatabase()//刪除
```
## 建立群集(資料表)
```
db.createCollection(name, options)
```
* name: 要建立的群集名稱
* options: **可選**引數, 指定有關記憶體大小及索引的選項
* capped
* boolean
* 如果為 true,則建立固定群集。固定群集是指有著固定大小的群集,當達到最大值時,它會自動覆蓋最早的檔案。
* autoIndexId
* boolean
* 如為 true,自動在 _id 欄位建立索引。預設為 false。
* size
* int
* 如果 capped 為 true,也需要指定該欄位
* max
* int
* 指定固定群集中包含檔案的最大數量
## 刪除群集(資料表)
```
db.collection_name.drop()
```
## 寫入檔案
```
db.COLLECTION_NAME.insert(document)
```
## 更新檔案
### update()
update() 方法用於更新已存在的檔案
```
db.COLLECTION_NAME.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
```
* query
* update的搜尋條件,類似sql update搜尋內where後面的
* update
* update的物件和一些更新的運算子(如$,$inc...)等,也可以理解為sql update搜尋內set後面的
* upsert
* 如果不存在update的資料,是否寫入,true為寫入,預設是false,不寫入
* multi
* 預設是false,只更新找到的第一筆資料,如果這個引數為true,就把按條件查出來多條資料全部更新。
* writeConcern
* 拋出例外
### save()
save() 方法透過傳入的檔案來取代已有檔案
```
db.COLLECTION_NAME.save(
<document>,
{
writeConcern: <document>
}
)
```
* document
* 檔案資料
* writeConcern
* 是否拋除例外
### 範例
只更新第一筆資料:
```
db.COLLECTION_NAME.update( { "count" : { $gt : 1 } } , { $set : { "test2" : "OK"} } );
```
全部更新:
```
db.COLLECTION_NAME.update( { "count" : { $gt : 3 } } , { $set : { "test2" : "OK"} },false,true );
```
只新增第一條:
```
db.COLLECTION_NAME.update( { "count" : { $gt : 4 } } , { $set : { "test5" : "OK"} },true,false );
```
全部新增進去:
```
db.COLLECTION_NAME.update( { "count" : { $gt : 5 } } , { $set : { "test5" : "OK"} },true,true );
```
全部更新:
```
db.COLLECTION_NAME.update( { "count" : { $gt : 15 } } , { $inc : { "count" : 1} },false,true );
```
只更新第一筆資料:
```
db.COLLECTION_NAME.update( { "count" : { $gt : 10 } } , { $inc : { "count" : 1} },false,false );
```
## 刪除檔案
```
db.COLLECTION_NAME.remove(
<query>,
{
justOne: <boolean>,
writeConcern: <document>
}
)
```
* query
* 刪除的檔案的條件
* justOne
* 如果設為 true 或 1,則只刪除一個檔案,如果不設定該引數,或使用預設值 false,則刪除所有匹配條件的檔案
* writeConcern
* 拋出例外
## 搜尋檔案
```
db.COLLECTION_NAME.find(query, projection)
```
* query
* 使用搜尋運算子指定搜尋條件
* projection
* 使用投影運算子指定回傳的鍵。搜尋時回傳檔案中所有鍵值, 只需省略該引數即可
### pretty() 方法以格式化的方式來顯示所有檔案。
```
db.COLLECTION_NAME.find().pretty()
```
### MongoDB 與 RDBMS Where 敘述比較
| 操作 | 格式 | 範例 |
| ---------- | ----------------------- | ---- |
| 等於 | ``{<key>:<value>}`` | ``db.COLLECTION_NAME.find({"by":"test"}).pretty()`` |
| 小於 | ``{<key>:{$lt:<value>}}`` | ``db.COLLECTION_NAME.find({"likes":{$lt:50}}).pretty()`` |
| 小於或等於 | ``{<key>:{$lte:<value>}}`` | ``db.COLLECTION_NAME.find({"likes":{$lte:50}}).pretty()`` |
| 大於 | ``{<key>:{$gt:<value>}}`` | ``db.COLLECTION_NAME.find({"likes":{$gt:50}}).pretty()`` |
| 大於或等於 | ``{<key>:{$gte:<value>}}`` | ``db.COLLECTION_NAME.find({"likes":{$gte:50}}).pretty()`` |
| 不等於 | ``{<key>:{$ne:<value>}}`` | ``db.COLLECTION_NAME.find({"likes":{$ne:50}}).pretty()`` |
>MongoDB 搜尋檔案 OR 條件、AND 條件
>https://www.twcode01.com/mongodb/mongodb-query.html
## 條件運算子
* ``>`` 大於 ``$gt``
* ``<`` 小於 ``$lt``
* ``>=`` 大於等於 ``$gte``
* ``<= `` 小於等於 ``$lte``
## 運算
```
db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
```
### 運算式
* $sum 總和
* ``db.COLLECTION_NAME.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}])``
* $avg 平均值
* ``db.COLLECTION_NAME.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}])``
* $min 取得最小值
* ``db.COLLECTION_NAME.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}])``
* $max 取得最大值
* ``db.COLLECTION_NAME.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}])``
* $push 寫入值到一個陣列中
* ``db.COLLECTION_NAME.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}])``
* $addToSet 寫入值到一個陣列中,但不建立副本
* ``db.COLLECTION_NAME.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}])``
* $first 根據資源檔案的排序取得第一個檔案資料
* `` db.COLLECTION_NAME.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}])``
* $last 根據資源檔案的排序取得最後一個檔案資料
* `` db.COLLECTION_NAME.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}])``
### 操作
* $project:修改輸入檔案的結構。可以用來重命名、增加或刪除域,也可以用於建立計算結果以及巢狀檔案。
* $match:用於過濾資料,只輸出符合條件的檔案。$match使用MongoDB的標準搜尋操作。
* $limit:用來限制MongoDB聚合管道回傳的檔案數。
* $skip:在聚合管道中跳過指定數量的檔案,並回傳餘下的檔案。
* $unwind:將檔案中的某一個陣列型別欄位拆解成多條,每條包含陣列中的一個值。
* $group:將群集中的檔案分組,可用於統計結果。
* $sort:將輸入檔案排序後輸出。
* $geoNear:輸出接近某一地理位置的有序檔案。
>https://www.twcode01.com/mongodb/mongodb-aggregate.html