---
# System prepended metadata

title: MongoDB 隨手筆記
tags: [MongoDB, NoSQL, 學習筆記, Docker]

---

# MongoDB 隨手筆記

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

![](https://i.imgur.com/d4SOQAX.jpg)



## 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格式來描述，資料如下：
    
![](https://i.imgur.com/nt83clF.jpg)


    
## 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` `學習筆記` 