# MongoDB 隨手筆記
由於Web應用程式和服務是NoSQL開發背後的主要驅動因素,因此,與RDBMS相比,各種類型的NoSQL資料庫都更具優勢。

## MongoDB terminalogies(相較於SQL):
> * documents 等同於 rows
> * collection 等同於 table
> * field 等同於 column
## 安裝
> 1. 從mongodb website下載
> 2. docker image
## 從docker image開始,裡面有2個容器
> 1. MongoDB
> 2. MongoExpress (WEB GUI)
docker-compose.yaml:
version: "3.8"
services:
mongodb:
image: mongo
container_name: mongodb
ports:
- 27017:27017
volumes:
- data:/data
environment:
- MONGO_INITDB_ROOT_USERNAME=rootuser
- MONGO_INITDB_ROOT_PASSWORD=rootpass
mongo-express:
image: mongo-express
container_name: mongo-express
restart: always
ports:
- 8081:8081
environment:
- ME_CONFIG_MONGODB_ADMINUSERNAME=rootuser
- ME_CONFIG_MONGODB_ADMINPASSWORD=rootpass
- ME_CONFIG_MONGODB_SERVER=mongodb
volumes:
data: {}
networks:
default:
name: mongodb_network
## Docker compose 指令:
docker-compose.yaml 為預設檔
docker-compose -f docker-compose.yaml up //由docker-compose 1個指令來帶起容器,指定特定的yaml檔
docker compose -f docker-compose.yaml up //由docker和compose 2個指令來帶起容器,指定特定的yaml檔
docker compose up // 讀預預設yaml檔來啟動容器
docker compose down // 關閉並刪除容器、volume等內容,外部volume的不會刪除
docker compose start // 啟動容器
docker compose stop // 關閉容器
docker compose up -d // 啟動容器並在背景執行 -d 為 detach mode
## 連接到mongoDB
> 1. 用GUI CLIENT(MongoExpress, DataGrip, MongoCompass)
> 2. Mongo Shell
> --> mongo mongodb://localhost:27017 -u username -p userpassword
#### 在 mongo shell當中:
db.help(); //查詢可用指令
use database_name; //使用或切換資料庫
show dbs; //顯示有哪些資料庫
db.getName(); //返回當前資料庫名稱
db.createCollection("person"); //建立名為 person 的collection
db.dropDatabase(); //刪除當前資料庫
db.person.stats(); //查看table的統計狀態
db.person.drop(); //刪除collection
show collections //查詢資料庫的collections
## MongoDB 的 collection field 格式
Document儲存格式為BSON,以JSON格式來描述,資料如下:

## MongoDb - CRUD
db.collection.insert(JSON) //插入1筆
db.collection.insertMany([JSON,....]) //搜入很多筆
db.collection.find(); //回傳查詢結果
db.collection.find().pretty(); //回傳查詢結果並讓它變『好看』一點
db.collection.find().pretty().count(); //回傳筆數
-> find{criterias, projections) //條件式查詢,投射出指定欄位
db.collection.find({firstName: 'Cally'}, {firstName:1, lastName:1})
-> projections 1 = 顯示(正向表列), 0 = 不顯示(負向表列)
db.collection.update({criterias:value},{command{fields:value, ...}}) //更新1筆
Commands:
-> $set 更新欄位值
-> $unset 是移除的意思,移除某一個欄位
-> $inc 增加指定數量
-> $pull 陣列某個元素
-> $push 加入某個元素到陣列
db.collection.deleteOne({}) //沒有給予criteria,刪除1筆
db.collection.deleteMany({gender: "M"}) //刪除多筆資料,當性別為M時
參考資料:
https://docs.mongodb.com/manual/crud/
https://www.youtube.com/watch?v=Www6cTUymCY
###### tags: `NoSQL` `MongoDB` `Docker` `學習筆記`