Skip to content

Instantly share code, notes, and snippets.

@chiehwen
Last active August 29, 2015 14:04
Show Gist options
  • Select an option

  • Save chiehwen/cf642183bb6973184bd9 to your computer and use it in GitHub Desktop.

Select an option

Save chiehwen/cf642183bb6973184bd9 to your computer and use it in GitHub Desktop.

MongoDB

MongoDB 是由 10gen 所開發的文檔導向資料庫 (document-oriented database)

MongoDB, Inc 與 10gen MongoDB, Inc 是開發 MongoDB 資料庫的公司,它原先叫 10gen,後來在 2013 年時將公司名稱更改成 MongoDB, Inc.,除了開發 MongoDB 資料庫之外,它們還有提供 MongoDB 相關的技術支援、訓練等服務。

安裝 MongoDB

% 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/

使用 Native Node.js Driver 操作 MongoDB

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

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.js + Mongoose

在初學 Express 過程中,你會在網路上看到有人說 Express 是 MVC 框架,其實這個說辭有誤,Express 並沒有 Model, 接下來我們將介紹 Mongoose,一個 MongoDB 的 DOM,當 Express 加上 Mongoose 才是"真的"符合 MVC 架構,

連線到 MongoDB

定義資料模型

我們通常透過 Schema 來定義 Model

"use strict";

var Schema = mongoose.Schema;
var ObjectId = Schema.ObjectId;

var BlogPost = new Schema({
    author    : ObjectId
  , title     : String
  , body      : String
  , date      : Date
});

設計一個正確的資料模型 (Data Model)

MongoDB 的技術長就曾在一次專訪時表示『因為 MongoDB 非常靈活,所以使用者經常不考慮花時間去設計比較合適的模型,最終這將演變成搬著石頭砸自己的腳。』

MongoDB 的 Schema 設計

從關聯式資料庫轉換至非關聯資料庫時,開發人員在設計資料庫時,需要轉換一下設計的思維

正規化 or 反正規化

反正規化在 MongoDB 中就是 embedded document 極高的即時(Real-time)性能和立即的資料一致性是無法兼得的,你必須依照應用的場景來做決定。 正規化設計的結果,就是讀取的速度較慢,但是所有

管理 MongoDB

匯出指定的 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 存取 MongoDB

出於安全的考量,應該綁定內網的 IP 綁定 IP 的方式很簡單,在啟動 MongoDB 時,加上 --bind_ip 的參數就可以了

$ mongo --bind_ip 10.10.10.25

如此以來,若不是 10.10.10.25 的 IP 就無法存取 MongoDB。

  • 註:仍然要防範 IP 偽冒的攻擊。

變更 MongoDB 服務埠口

MongoDB 預設的埠口為 27017,為了安全起見,建議修改此埠口號,避免自動化工具針對 MongoDB 進行惡意連線的攻擊。

$ mongo --bind_ip 10.10.10.25 --port 20000

在修改服務埠口後,在連線至 MongoDB 時,必須指定正確的埠口,否則會產生無法連線等連線錯誤的訊息。

$ mongo 10.10.10.25:20000

設置使用者帳號及密碼

顯示當前 Sharding 的狀態資訊

> db.printShardingStatus()

延伸閱讀及參考資料

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment