這是歷史版本頁面 — 看 MongoDB 最新版本

資料結構一直改,MongoDB 能幫上什麼忙

MongoDB 軟體圖示 MongoDB 4.0.15 資料更新 2020-01-24 閱讀約 7 分鐘

你正在開發一個新服務,資料格式一週變三次。今天多一個欄位,明天巢狀結構要加深一層,後端工程師改程式倒還好,但資料庫那邊每次都要先「遷移」——改表格、改欄位型別、跑腳本,弄到一半還會卡住。你只是想趕快把功能做出來,卻被資料庫的結構綁手綁腳,連帶整個開發進度都慢下來。

傳統關聯式資料庫的強項是嚴謹的表格結構,但這也代表每一次資料形狀的改變,都要先動到資料庫本身。對一個還在摸索階段、需求隨時在變的專案來說,這種「先定義再使用」的流程很拖速度。文件導向資料庫的切入點正好相反:它不要求你先畫好表格,而是直接把資料存成一份一份的文件,欄位可以隨時增減,結構變了也不用先改資料庫。這讓開發者可以先把功能跑起來,之後再回頭整理資料。

MongoDB 操作介面
MongoDB 的操作介面

01MongoDB 是什麼?跟 MySQL 有什麼不同?

MongoDB 是一套文件導向的 NoSQL 資料庫,資料以類似 JSON 的文件格式存放,不需要事先定義表格結構。MySQL 是關聯式資料庫,資料必須先設計成表格、欄位,再開始寫入。MongoDB 的優勢在於欄位可以隨時增減,適合資料格式還在變動的階段;MySQL 則在需要複雜關聯查詢、交易一致性時更有把握。

02這套軟體要怎麼安裝?裝完之後怎麼開始用?

官方提供的安裝方式是執行安裝精靈,安裝過程會引導你設定環境變數。裝完之後,從命令提示字元啟動 MongoDB,再用 MongoDB Compass 這個圖形介面來管理資料庫。Compass 可以讓你用視覺化的方式看資料、建立資料庫、操作集合,不需要全部用指令。系統需求是 Windows 10 或 11、至少 2GB 記憶體、200MB 磁碟空間。

MongoDB 介面畫面 2
MongoDB 介面畫面

03資料要怎麼存進去?一定要先設計表格嗎?

不用。MongoDB 的資料是文件格式,你可以直接插入一筆 JSON 文件,欄位隨你定義。例如第一筆資料有 name 和 age 兩個欄位,第二筆資料多一個 email 欄位,完全沒問題,資料庫不會拒絕。這跟 MySQL 要先建表格、定義每個欄位型別完全不同。要建立或刪除資料庫、管理集合和索引,都可以透過內建的 Shell 或 Compass 圖形介面操作。

04要怎麼查資料?有圖形介面可以用嗎?

查詢用 MongoDB 的查詢語言,寫法接近 JavaScript 物件,例如找出 age 大於 30 的資料,就傳一個 `{ age: { $gt: 30 } }` 的條件進去。圖形介面方面,官方有 MongoDB Compass,可以視覺化瀏覽資料、看 schema 結構、執行查詢,不用全部靠指令。另外也內建 Map-Reduce 編輯器,方便做資料處理。

MongoDB 介面畫面 3
MongoDB 介面畫面

05資料量很大的時候,它撐得住嗎?

MongoDB 的設計目標之一就是水平擴展,官方資料提到可以做到數百億份文件、PB 等級的資料量,每秒處理數百萬次操作。它內建複寫(replication)和分片(sharding)機制,可以把資料分散到多台伺服器,同時在不同地理區域複寫資料,達到高可用性。不過這些功能需要自己設定,不是裝完就自動生效。

06什麼樣的人適合用這套軟體?

適合正在開發新服務、資料格式還不穩定的人,尤其是產品需求還在快速迭代的階段。因為不用每次改欄位就做一次遷移,開發速度會快很多。也適合需要跟多種程式語言整合的專案,官方強調它容易跟多種語言整合。另外,如果你需要處理大量非結構化資料,例如日誌、使用者行為紀錄,文件導向的儲存方式會比表格靈活。

MongoDB 介面畫面 4
MongoDB 介面畫面

07只會寫 SQL 的人,學這套會很吃力嗎?

會有一段適應期。SQL 的思維是「從多張表格撈資料、做關聯」,MongoDB 的思維是「直接拿整份文件」。查詢語法也完全不同,SQL 用 `SELECT`、`WHERE`,MongoDB 用 JSON 格式的條件物件。如果你已經習慣關聯式資料庫的嚴謹結構,MongoDB 的彈性反而可能讓你不適應,因為沒有明確的 schema 可以依賴。官方文件是英文的,沒有中文介面,這也會增加學習成本。

08什麼情況不該用這套軟體?

如果你的資料有強烈的一致性要求,例如金融交易、訂單系統,MongoDB 的 multi-document transactions 支援有限,官方資料也提到可能有資料一致性問題。另外它很吃記憶體,官方建議至少 4GB RAM,如果你的伺服器資源有限,跑起來會很吃力。備份和還原的流程也比較複雜,不像 MySQL 的備份工具那麼成熟。這些情況下,關聯式資料庫會是更穩的選擇。

09跟 MySQL 比起來,它有什麼明顯的缺點?

從評分人數來看,MySQL 有 1021 人評分,MongoDB 只有 95 人,表示 MySQL 的使用者基數大很多,遇到問題時找得到比較多前人經驗。MongoDB 的缺點包括:高記憶體使用量、多文件交易支援有限、備份還原流程複雜、對初學者學習曲線較陡。如果你的專案需要大量交易、複雜關聯查詢,MySQL 會更適合。MongoDB 的優勢在於彈性 schema 和水平擴展能力。

10這套軟體有中文介面嗎?文件有中文的嗎?

介面語言是英文,沒有中文介面。官方文件也是英文的,沒有提供中文版本。如果你對英文介面不熟悉,操作上會需要多花時間適應。不過 MongoDB 的使用者很多,網路上可以找到不少中文教學文章和討論,遇到問題時搜尋一下通常有解。但官方支援和文件就是英文為主,這點要先有心理準備。

11免費版跟付費版差在哪裡?

官方資料提到,MongoDB 本身是免費且開源的,核心功能包含嵌入式 Shell、Map-Reduce 編輯器、GridFS 編輯器、使用者和角色管理。付費的 Enterprise Advanced 版本則多了企業級伺服器、進階軟體套件、技術支援和認證服務。Professional 版本提供 24/7 技術支援團隊、Cloud Manager 監控管理平台,以及 MongoDB Compass 圖形介面。免費版夠不夠用,取決於你的專案規模和是否需要官方技術支援。

下載與官方連結

前往官方網站 下載 MongoDB

mongodb-win32-x86_64-2008plus-ssl-4.0.15-signed.ms · 211 MB · 連結指向軟體原廠

版本紀錄

再看 5 筆

看完整版本清單

這一版改了什麼

What's new in this version:

Security:
- Ensure bind credentials live longer than LDAP operations

Sharding:
- Make allow_partial_results.js, return_partial_shards_down.js start shards as replica sets
make fsm workloads that extend kill_rooted_or.js more robust in the sharded concurrency suites, or blacklist them
- Add namespace to ChunkManager ShardKeyNotFound failure in order to better diagnose failures.
- Do not choose only first shard of all shards associated with a zone when pre-splitting during shard collection
- Make the BatchWriteExecutor retry multi-writes only against unsuccessful shards

Replication:
- ReplicationCoordinatorExternalState and data replication must not be started after shutdown
- Race while setting replication maintenance mode.
- Race in replsets/auth2.js
- fix the “me” field in isMaster responses when using splithorizon

Query:
- Aggregations and find commands sort missing fields differently
- Negation of inequality on array can trip invariant

Aggregation:
- Change stream should throw ChangeStreamFatalError if a single shard cannot be targeted for updateLookup
- Storage
- include Client/OpCtx information in LockManager::dump() output
- Adjust nojournal startup warning to be more compelling

Operations:
- Remove upstream metadata from v4.2’s third party library manifest
- Build and Packaging
- Remove mobile specific embedded commands
- Ubuntu 18.04 package testing task fails to install openssl

Internals:
- Relax expectations in apply_batches_totalMillis
- A stashed Locker should keep information about the owning transaction
- Refactor storage engine lock file support
- jstests/sharding/kill_sessions.js doesn’t wait for operation to be killed.
- Add a log line for when a cursor is reaped due to logical session cleanup
- Incorrect serialization for $elemMatch $not $ne
- Remove unused db_raii and server_status libs from storage_wiredtiger_core’s LIBDEPS_PRIVATE
- Correct logic to re-compute dependencies after absorbing a $sort into query layer
- Ensure RoleGraph can serialize authentication restrictions to BSON
- Fix strace in syscall test
- Reduce configuration parsing overhead from checkpoints
- Remove temporary files in clang-format script
- Handling goto labels with multiple words in s_goto.py
- Checkpoint hangs when reconciliation doesn’t release the eviction generation
- Adding new stats for eviction target strategy
- Change lookaside file inserts to use cursor.insert
- WT_REF_LIMBO pages cannot support fast (leaf-page only) searches
- Data mismatch failures with test/checkpoint after enabling LAS sweep
- Improve eviction to differentiate between clean and dirty pages with WT_CACHE_EVICT_NOKEEP readgen
- Fix syscall failure about metadata file open
- Ensure that only idempotent modify operations are logged
- Cursor key out-of-order detected in the lookaside file
- syscall.py fail on mongodb-4.0