2021 iThome 鐵人賽 - DAY4 MongoDB 資料庫與 Collection

2021 iThome 鐵人賽 MongoDB披荊斬棘之路


DAY4 MongoDB 資料庫與 Collection

Database

MongoDB 一個 instance 中可以有很多資料庫,預設的有三個,admin, config, local。當我們連進 MongoDB 後,輸入 show dbs 就可以看到這三個,這三個分別有其用處。

  • admin:
    看這個名字可以想見這個資料庫很重要,對的,所有的重要資訊、重要指令都只能在這個資料庫底下操作。例如要新增角色或者關閉 instance,相當於所有資料庫的 administrator 一般。

    如果要建立個別資料庫的使用者或角色,在各別的資料庫建立即可,但如果想要跨資料庫,則需要在這裡建立,這樣會自動繼承到其他資料庫。

  • config:
    此資料庫主要是存放 sharding 相關的資訊。在 3.6 版後,開始存放 standalone 或 replication 的資料,也有跟 transaction 相關的資料,但無論如何是禁止去針對這個資料庫進行修改或刪除的,僅有查看可以。

  • local:
    用來存放這個 instance,在這台機器的檔案與資訊,不會因為 replica set 的設定而把相關資料複製走,簡單來說就是別人用不到的資訊。連進去就有一個 startup_log 可以查看。

建立資料庫

建立資料庫並不需要特別宣告,直接 use 即可,以下為範例:

1
2
3
4
5
6
test> show dbs
admin 41 kB
config 111 kB
local 73.7 kB
test> use testUsedDatabase
switched to db testUsedDatabase

直接使用 use testUsedDatabase 就會切換到當下資料庫。

Collection

Collection 就相當於 RDBMS 內的資料表(table)的概念,只是它存放的是文件(document)而非固定大小、格式的資料(record),例如:

1
2
3
4
5
6
7
8
9
10
11
12
//Record1
{
"_id": "customized_id1",
"fieldA": "valueA"
},
//Record2
{
"_id": "customized_id2",
"fieldA": "valueA",
"fieldB": 105,
"fieldC": 3.1415
}

這樣的兩筆一樣可以直接寫入 DB 喔!

1
2
3
4
5
6
7
8
9
10
11
12
13
db.getCollection('test-collection').insertMany([
{
"_id": "customized_id1",
"fieldA": "valueA"
},
//Record2
{
"_id": "customized_id2",
"fieldA": "valueA",
"fieldB": 105,
"fieldC": 3.1415
}
])

結果如圖:

alt

建立 Collection

建立一般 Collection 不需要特別宣告,直接寫入任意資料即可,以下為範例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
local> show dbs
admin 41 kB
config 111 kB
local 73.7 kB
local> use testUsedDatabase
switched to db testUsedDatabase

testUsedDatabase> show collections

testUsedDatabase> db.getCollection('autoCreatedCollection').insertOne({"field": "hi"})
{
acknowledged: true,
insertedId: ObjectId("612cf44a031915cb2af17374")
}

testUsedDatabase> show collections
autoCreatedCollection

直接 insert 資料就會建立你指定的 collection。

Capped collection

MongoDB 另一個強大的 collection 類別,叫做 capped collection。這種類型有幾個特點:

  1. 必須先宣告才能使用
  2. 宣告時必須指定大小,且不允許更改
  3. 裡面的資料無法單獨修改,要,就只能全部刪除重來
  4. 無需 Index,但速度堪比有加上 index 的一般 collection
  5. 因為固定大小的緣故,當資料筆數滿時,會優先覆蓋最早寫入的資料
  • 確認是否為 capped collection
1
db.getCollection('test-collection').isCapped()
  • 建立 capped collection,size 單位為 byte; max 是最多幾筆資料的意思
1
db.createCollection( "test-capped.collection", { capped:true, size:1024*1024 , max:100 } )

Views

MongoDB 的 views 很像是某些老牌資料庫的簡易版,我在這邊不打算講得太詳細,因為個人認為在大部分情況下比較少需要使用到。可以想像它就是一個 method,可以自幾定義參數,經過查詢後返回結果。

特色

  • 只能查詢
  • 可以使用 aggregation pipeline
  • 可以使用 $merge 產生結果到別的資料庫或 collection
  • 實時查詢,並不會建立或快取任何結果,因此沒有效能上提升

使用場景

  • 簡化你的查詢語法
  • 提供給較少權限或者特定權限的使用者查詢

關於 MongoDB Views 我暫時想不到別的了,如果很落實權限設計,應該也不會讓特定使用者直接查到資料庫才是。

  • 作者: MingYi Chou
  • 版權聲明: 轉載不用問,但請註明出處!本網誌均採用 BY-NC-SA 許可協議。