MongoDB 是由 10gen 所開發的文檔導向資料庫 (document-oriented database)
MongoDB, Inc 與 10gen MongoDB, Inc 是開發 MongoDB 資料庫的公司,它原先叫 10gen,後來在 2013 年時將公司名稱更改成 MongoDB, Inc.,除了開發 MongoDB 資料庫之外,它們還有提供 MongoDB 相關的技術支援、訓練等服務。
- 10gen Announces Company Name Change to MongoDB, Inc. http://www.mongodb.com/press/10gen-announces-company-name-change-mongodb-inc
% sudo apt-key adv --keyserver keyserver.ubuntu.com --recv 7F0CEB10 # 將 MongoDB 的套件庫的公開金鑰匯入
% echo 'deb http://downloads-distro.mongodb.org/repo/debian-sysvinit dist 10gen' | sudo tee -a /etc/apt/sources.list.d/mongodb.list # 在系統中新增 MongoDB 的套件庫 (Repository)
% sudo aptitude update # 更新 apt 的資料庫
% sudo apt-get install mongodb-org # 安裝當前最新的 MongoDB 版本
% sudo service mongod start # 啟動 MongoDB 服務http://docs.mongodb.org/manual/tutorial/install-mongodb-on-debian/
var mongodb = require('mongodb');
var MongoClient = mongodb.MongoClient;
// 連線至 MongoDB
MongoClient.connect('mongodb://localhost/test', function(err, db) {
db.collection('contact', function(err, collection) {
collection.find({}, function(err, rows) {
for (var index in row)
console.log(rows[index]);
});
});
});Mongoose 是一個 Node.js 的函式庫,它提供給 Node.js 一個類似 ORM 的界面與 MongoDB 物件對映。如果你處在一個連 ORM (Object Relational Mapping) 或 ODM (Object Document Mapping) 都還不了解是什麼的情況下,先記住 Mongoose 會將 MongoDB 中的資料轉換成 JavaScript 物件提供給你的應用程式使用即可。讓我們來看看如何使用 MongoDB 和 Mongoose 在一個 collection 中新建與儲存 documents
備註:在開始前,請先確定你的環境已經安裝好 Node.js 與 MongoDB。在進行範例實作前,請先確定你的 MongoDB 已正在運行。
連線到 MongoDB 中的一個名為 test 的資料庫,它是 MongoDB 預設的資料庫,如果你直接在 shell 下輸入 mongo 會看到它直接連線到 test。我們也會確保每一個連線錯誤 (connection error) 都會被寫到 console 上。
// Connecting to MongoDB
var mongoose = require('mongoose');
var db = mongoose.connection;
db.on('error', console.error);
db.once('open', function() {
// 在這裡創建你的 schema 與 models
});
mongoose.connect('mongodb://localhost/test');
首先,我們需要在 MongoDB 中建立 Schema 與 Model 以便對資料進行操作。Schema 被儲存在 documents 中,它定義著 documents 的結構。結構中的的 collection 與 models 會被使用來建立一個資料的實例(instances)。
另外要注意的是 model 的名稱是大寫的,這是因為在編譯 model 的時候,結果是一個建構函式 (constructor),它會被用來建立 model 的 instance。這個由 model 建構函式建立的實例式 documents 將會被 MongoDB 持久保存。
在初學 Express 過程中,你會在網路上看到有人說 Express 是 MVC 框架,其實這個說辭有誤,Express 並沒有 Model, 接下來我們將介紹 Mongoose,一個 MongoDB 的 DOM,當 Express 加上 Mongoose 才是"真的"符合 MVC 架構,
我們通常透過 Schema 來定義 Model
"use strict";
var Schema = mongoose.Schema;
var ObjectId = Schema.ObjectId;
var BlogPost = new Schema({
author : ObjectId
, title : String
, body : String
, date : Date
});MongoDB 的技術長就曾在一次專訪時表示『因為 MongoDB 非常靈活,所以使用者經常不考慮花時間去設計比較合適的模型,最終這將演變成搬著石頭砸自己的腳。』
從關聯式資料庫轉換至非關聯資料庫時,開發人員在設計資料庫時,需要轉換一下設計的思維
反正規化在 MongoDB 中就是 embedded document 極高的即時(Real-time)性能和立即的資料一致性是無法兼得的,你必須依照應用的場景來做決定。 正規化設計的結果,就是讀取的速度較慢,但是所有
匯出指定的 Collection
$ mongoexport -d database_name -c collection_name -o export_filename
匯入指定的 Collection
$ mongoimport -d database_name -c collection_name import_filepath
如果想要將 Collection 匯出成陣列,或是要匯入的 Collection 是陣列,可以加上
--jsonArray,像是:% mongoimport -d e-commerce -c orders orders.json --jsonArray。
備份資料庫
$ mongodump -d database_name -o /nas/backup_path/
還原資料庫
$ mongorestore -d database_name /nas/backup_path/*
修復資料最簡單的方法就是在啟動 MongoDB 時帶上 --repair 參數。 若單純只想要修復特定的資料庫,可以在 Shell 下執行 repaireDatabase 的指令,例如要修復 test 資料庫時,可以輸入:
> use test
switched db to test
> db.repaireDatabase()
{ "ok" : 1 }
出於安全的考量,應該綁定內網的 IP 綁定 IP 的方式很簡單,在啟動 MongoDB 時,加上 --bind_ip 的參數就可以了
$ mongo --bind_ip 10.10.10.25
如此以來,若不是 10.10.10.25 的 IP 就無法存取 MongoDB。
- 註:仍然要防範 IP 偽冒的攻擊。
MongoDB 預設的埠口為 27017,為了安全起見,建議修改此埠口號,避免自動化工具針對 MongoDB 進行惡意連線的攻擊。
$ mongo --bind_ip 10.10.10.25 --port 20000
在修改服務埠口後,在連線至 MongoDB 時,必須指定正確的埠口,否則會產生無法連線等連線錯誤的訊息。
$ mongo 10.10.10.25:20000
顯示當前 Sharding 的狀態資訊
> db.printShardingStatus()