本系列文章是個人筆記,格式與內容不會非常嚴謹與工整


了解自己的習慣

列下自己從起床後到出門上班的習慣,每一個動作都在旁邊附註 + - = 符號

  • + 是好習慣
  • - 是壞習慣
  • = 是不好也不壞

了解自己的每一個習慣是很重要的。
習慣在每個時期不見得是好或壞,做這件事情的目的是為了要察覺自己,慢慢減少你認為的壞習慣。

開始一個好的習慣

明確列出

  • 做什麼
  • 幾點開始做(確切時間)
  • 地點(明確位置)

有確切計畫會比較高機率執行

閱讀全文 »

MongoDB, out, merge


在 SQL 當中我們很常使用 INSERT INTO SELECT 語法,查詢後直接寫到新的 table。很慶幸的是 MQL 也同樣支援這個語法,就是 aggregation 內的 out

關於 out,是比較早推出的版本(2.6),後面有推出新的語法叫做 merge,是更進階與細節的語法。
out 可視為較陽春的版本,如果沒複雜操作,使用 out 即可,之後再做 merge 的說明。

1
2
{ $out: { db: "<output-db>", coll: "<output-collection>" } }
// 補充,4.4 之後的版本才支援指定 db 語法唷

out 語法僅有兩個參數,dbcoll,分別是要輸出的資料庫以及集合。

out 僅能在 aggregation pipeline 中使用,且必須是最後一個執行的階段,也就是說在前面可以執行任何的資料篩選、操作和轉型,最終輸入到目的地。

另外要補充的是,如果目的地已經有資料,會無條件直接覆蓋


閱讀全文 »

MongoDB 匯入匯出資料其實才鐵人賽的文章當中就寫過了,不過一直覺得不太完整,特別是匯出 json 這塊,所以還是重新發一次。

MongoDB 總共有兩組指令,分別是能夠匯出 bson 的 mongodump 以及匯出 json 的 mongoexport。前者顧名思義就是匯出完整的 bson 以及 index 完整集合資料,後者只能夠匯出 json 格式,所以會有資料型態遺失的問題,唯一優點就是能夠閱讀。

  • mongodump / mongorestore

    • 格式 bson
    • 包含 index
    • 資料型態不會遺失
    • 匯出後人類無法閱讀
    • 匯出速度較快
    • 匯入資料不會有資料型別遺失問題
    • 僅適合維運備份資料使用
  • mongoexport / mongoimport

    • 格式 json
    • 不包含 index
    • 匯出速度較慢
    • 資料型別會遺失,所以無法用來匯入匯出
    • 僅適合人類閱讀

以上兩組指令是成對使用的,雖然我不太能理解為什麼要設計兩套….


mongodump

常用的參數設定有:

  • host: DB位址
  • u: User,登入帳號
  • p: Password,登入密碼
  • authenticationDatabase: 預設的唯一DB
  • d: database,要匯出資料的DB
  • c: collection,要匯出資料的Collection
  • query: 要用來查詢/過濾資料的語法
  • o: output,匯出資料的路徑

指令範例

1
mongodump --host "127.0.0.1:27017" -u root -p pass --authenticationDatabase admin -d dbname -c 'collection.name' -o "/Users/pattri.chou/mongodump" --query='{"_id": {"$in":["AAA","BBB"]}}'
閱讀全文 »

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


DAY30 MongoDB 使用經驗分享 & 完賽

終於來到鐵人賽的最後一天了,今天不講太多技術細節,純粹是一些淺薄經驗分享。

在賽前初步規劃大綱時,發現有兩個項目放不進去 30 天內,分別是 Data ModelingSharding。想了一下觀念性的東西看的人少很多,有使用到 sharding 也是,所以乾脆不放在這次的鐵人賽內,之後會在個人部落格那邊補完。Time series collection這個功能會寫進入,純粹是因為幾乎沒人用,因為也是兩三個月前才剛發佈的功能,但秉持著學習精神,還是占用一天的篇幅了。

這 30 天內介紹了:

  • 基礎的觀念
  • 安裝與工具
  • 基礎操作
  • 進階操作
  • 日常維運
  • 系統監控

應該能夠幫助大家預先面對各種情境,甚至是架構規劃的注意事項。


每個工具都有優缺點,我曾遇過幾個特別苦手的項目,但這邊不會稱為,因為使用情境不同、資料量級也差異很大,因此不見得您會遇到。

閱讀全文 »

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


DAY29 MongoDB 使用 C# Driver 操作

不知道有沒有人記得 DAY1 文章說本篇使用 .NET 平台,結果一直到第 29 天都還沒有寫到任何有關的東西,其實原本是想全程使用 .NET 來舉例,但考量到觀看者不一定使用 C#,還是乖乖回頭用 javascript 來說明。

會寫這一篇呢是想幫助過去的我自己,當時使用的語言是 C#,因專案要接觸 MongoDB,在語法上著實惱了一陣子,明明是很簡單的東西卻不習慣使用 Mongo C# Driver,導致額外花了不少時間在熟悉工具,要是有這一篇的話,肯定能快速上手(賣瓜?)

本篇文章會像是 Cheat sheet 性質,直接給予語法,一個速食的概念,實際應用在專案上,可以再重構得更漂亮些。另外本篇使用的語法都是強型別為主,畢竟使用 C# 就要發揮它的特性,如果使用字串代替欄位,雖然開發期很輕鬆快速,但很容易因為 typo 導致要抓 bug 抓很久,別問我為什麼知道,因為開發初期就吃了很多苦XD


以下的範例我們會使用下面這個 entity 來當作舉例

1
2
3
4
5
6
7
8
9
10
[BsonIgnoreExtraElements]
public class SampleClassEntity
{
[BsonId]
public string Id { get; set;}

public int IntField { get; set;}

public string StringField { get; set;}
}

[BsonIgnoreExtraElements] 是忽略沒有 mapping 到 C# 端的欄位

閱讀全文 »

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


DAY28 MongoDB Atlas 付費監控內容

這篇原本是要在25號發的,因為一些因素,只好延遲到這一天了。

全部的監控項目內容會過於龐大且不是主軸,於是放一些付費的監控指標,免費的功能就讓各位自己上去體驗了(官網的說明文件很詳盡)。


Metrics

alt

可以看到付費等級的監控服務和免費版的 Filter UI 是一樣的,但是時間區間就無法改日期,只有當天。

alt

閱讀全文 »

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


DAY27 MongoDB Time Series Collection

什麼是 Time series collection

MongoDB 5.0 發佈的新功能,僅在 5.0 之後的版本提供。
時間序列集合(Time series collection) 是一個新型態的集合,有別於 capped collection一般 Collection,它有諸多限制:

  • 僅支援 Read / Insert
  • 無法 Delete / Update,只能夠 drop collection
  • document 最大 4MB
  • 無法轉為 capped一般 collection,反之亦然
  • 沒辦法設定 Index 的 unique(_id為例外), partial
  • metaField, timeField (後面說明)兩欄位僅有在建立 Collection 才可以決定,之後無法修改。
  • Collection 無法 sharding

看了這麼多限制後,還是不知道什麼是時間序列集合。基本上該功能就可以想像成依照時間來進行統計分析的集合,像是股票資料或天氣資料這種,依照時間進行,然後去統計分析股票價位高低或者溫度的高低。

Time series collection 三大設定

  • timeField
    時間欄位,指定要做為統計的時間欄位,必須是要時間的資料型別

  • metaField
    分群的欄位,統計資料會自動以該欄位進行分群。
    因為只能指定一個欄位,所以可以進行變通,例如原本是 { "name": "Bruce"} 改為 { "name": "Bruce", "lastName": "Lee" }

  • granularity
    統計時間粒度,可以是 seconds, minuteshours

建立 Time series collection

閱讀全文 »

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


DAY26 MongoDB 匯入與匯出資料

系統運作時常發生在特定環境才會出錯的問題,其他環境又沒發生,我們通常會需要該環境的資料來想辦法重現問題。

有這需求時,第一時間當然是想直接透過 GUI 方式(環境允許的話)進行匯入匯出。於是我試了 MongoDB Compass,點選上方的 Collection -> Export Collection 就能夠有方便的操作囉!
alt

你以為事情結束就太簡單了,因為 MongoDB 儲存的資料格式終究是 bson 而非羅盤提供的 jsoncsv,有經驗的人已經想到會發生什麼事情了,沒錯,就是 Import(restore)。
在某些欄位型別會發生不可預期的轉型錯誤,反正你就是匯不進去了、也沒輒了。

所以一切還是回到原點,使用官方提供的指令來吧


mongodump

  • mongodump 資料匯出的指令。
閱讀全文 »

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


DAY25 MongoDB 自訂角色與使用者

前言

MongoDB 內的登入需要輸入 使用者(user) 帳號密碼,而每個 使用者 都有其對應的角色(身份),我們稱為 Role。在建立使用者的當下,必須指定他的角色,因此會先介紹如何建立 Role。

事前準備

可以使用其他方法,但我習慣用 docker-compose 啟動,可以使用乾淨的環境且我有設定快捷鍵XD

docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
version: "3.7"
services:
database:
image: mongo
container_name: mongodb-test
environment:
- MONGO_INITDB_ROOT_USERNAME=root
- MONGO_INITDB_ROOT_PASSWORD=pass.123
command: mongod --auth
ports:
- "27117:27017"

我們設定 root 帳密為 root / pass.123,以及啟動認證 mongod --auth

閱讀全文 »

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


DAY24 MongoDB Atlas (免費)雲端託管服務

MongoDB Atlas 是什麼?

MongoDB Atlas 是一個雲端的資料庫服務,現在可以讓你在 AWS、Azure 和 Google Cloud 建立託管服務,包含了可以建立高可用性(replication)與水平擴展的(sharding)功能,除此之外還有對外的防護、自動備份機制、全面的監控和告警。

在這個年代,自建機房與維運對於小團隊來說是一個非常沈重的負擔。前期規劃的硬體購置、網路頻寬、安全保護到後期的維護與監控,都是一個持續的花費,一整套評估下來都遠大於使用雲端服務來的花費,使用雲端既省時省力又省錢。很可惜今天沒有廠商來業配,不然就多寫幾篇(誤)。

新手有需要使用嗎?

個人強烈推薦要去使用看看,因為免費!!
這篇我將介紹如何從頭使用 MongoDB Atlas,還是會跳過簡單的步驟。那為什麼不一開始就使用 MongoDB Atlas 來當作練習呢?因為練習階段還是本機最好,不用有對外網路問題,弄壞資料也能夠瞬間重啟一個新的,最後是很多概念如果不懂,使用 MongoDB Atlas 也感受不到它的強力。

開始使用 MongoDB Atlas

首先登入它的MongoDB Atlas官網並註冊
alt

閱讀全文 »