[docker/mongo]使用docker啟動mongo與操作

什麼是mongo

MongoDB是NoSQL的資料庫,以文件儲存資料,一般資料庫開Table須定義欄位(大小、型別、名稱等),但是Collection完全不事先定義欄位,每筆document可以有不等數量的欄位

本文將會知道:

  • 使用docker-compose 快速啟動mongodb
    • 須先下載docker並具docker-compose知識
  • 簡單的工具操作與MongoDB Shell 更新批量資料

與關聯式資料庫名詞對應:

MongoDB RDBMS 意思
db DB 資料庫
collection Table 表格
document record 一筆紀錄

1.啟動mongo docker

這邊直接用編輯docker-compose.yml 貼上網路找到的內容

1
2
3
4
5
6
7
8
9
10
11
12
version: '3.1'

services:

mongo:
image: mongo
ports:
- "27017:27017"
restart: always
environment:
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: example

啟動

1
2
3
➜  mongo git:(master) ✗ docker-compose up -d   
Creating network "mongo_default" with the default driver
Creating mongo_mongo_1 ... done

2.操作資料內容

以下可用透過一些網上mongo工具 ex Robo3T操作

先進行連線進入介面host: localhost, port: 27017

CreateDB”test”,新增一筆Collection”user”,與新增Documanet如下(Json格式)

1
2
3
4
5
6
7
{
"profile" : {
"name" : "user1",
"gender" : "F",
"age" : 18
}
}

新增完會自動產生唯一的objectID,透過工具也可以對資料做簡單的修改動作。

3.mongo shell

  • 可以再有提供shell指令視窗的工具上下指令去做更新進階的搜尋,
  • 例如mongo 3T上方就有視窗可以使用.

搜尋指令

搜尋全部

1
db.getCollection('user').find({}) 

搜尋by_id

1
db.getCollection('user').find({_id:ObjectId("5eaa780f3dfac43981e4412c")})

限制顯示的欄位: 1可見,0不可見

1
2
3
4
5
db.getCollection('user').find({},{profile.name:1})

有一點像是
SELECT profile.name FROM user
_id預設顯示,可以關掉_id:0

搜尋內容值

1
db.getCollection('user').find({"profile.name":"user1"})

搜尋範圍 數字型態

1
2
[gt大於,gte大於等於,lt小於,lte小於等於]
db.getCollection('user').find({"profile.gender":"F","profile.age":{$gt:2,$lte:18}})

搜尋範圍 字串型態

1
2
按UTF-8進行字典排序 表搜尋字母A~Z間
db.getCollection('user').find({"profile.name":{$gt:"a",$lte:"z"}})

排序

1
2
依命名排序,其中 1 为升序排列,而 -1 是用于降序排列
db.getCollection('user').find({}).sort({name:1})

顯示筆數(limit)與開始(skip)

1
2
可以用他來做分頁讀取
db.getCollection('user').find({}).sort({name:1}).skip(0).limit(2)

計算總數

1
db.getCollection('user').find().count()

批次更新

一般來說工具就可以做內容更新,但如果需要透過指令,

更新欄位

將性別欄位“F”全改成“woman”

1
2
3
4
5
6
7
8
db.getCollection('user').find().forEach( function(d) {

if(d.profile.gender=="F"){
d.profile.gender="woman"
db.getCollection('user').update({"profile.name":d.profile.name},d);
print(d.profile.name+" process change done" );
};
});

新增欄位合併內容

1
2
3
4
5
db.getCollection('user').find().forEach( function(d) {
d.description= d.profile.name+","+d.profile.gender;
db.getCollection('user').update({"profile.name":d.profile.name},d);
print(d.profile.name+" process change done" );
});

刪除欄位

1
2
3
4
5
db.getCollection('user').find().forEach( function(d) {
delete d.description
db.getCollection('user').update({"profile.name":d.profile.name},d);
print(d.profile.name+" process change done" );
});

  • 如果是要在mongo的docker環境上面下指令
    需要把指令包成js,檔案丟進去docker裡面,
    然後下指令
    1
    2
    load("script/Change.js") //檔案位置
    mongo 127.0.0.1:27017/test Change.js
    執行結果與上述內容一樣

本章對mongo的簡單操作到此結束,
之後再介紹如何用golang程式去對mongo CRUD操作.

[docker/mongo]使用docker啟動mongo與操作

https://minilabmemo.github.io/2020/09/12/docker-mongo/

作者

Mini Lab Memo

發表於

2020-09-12

更新於

2023-01-23

許可協議

評論