今天要使用 Node.js 的 mongodb driver 來操作 DB

一樣先開啟虛擬機並且登入吧

會使用到的套件是:

mongodb -> mongodb native driver

或許有人有看過 mongoose -> 官網

算是 MongoDB 的 ORM,我們在這邊如果有時間的話再簡單了解一下,

現在先使用 native driver 來操作

我們在這邊就不裝全域套件了,裝在 API 專案裡面

並且使用 -save 來將相依性寫入 package.json 裏

$ cd /vagrant/API/
$ npm install mongodb -save

從虛擬機回到電腦的資料夾中,在虛擬機資料夾的 API 資料夾中,

今天我們先不和 express 搭配,因此就是純操作 node.js + mongodb module

新增一個 mongoTest.js

我們先來連線到 MongoDB,連線的方式有很多,下面是其中一種方式,

// 先宣告用的到的東西
var MongoClient = require('mongodb').MongoClient
    , Server = require('mongodb').Server
    , options = { auto_reconnection: true, poolSize: 10 };

// Server 設定
var mongoClient = new MongoClient(new Server('localhost', 27017, options));

// 開啟連線
mongoClient.open(function(err, mongoClient) {
    var db1 = mongoClient.db("testDB");

    if (!err) {
        console.log("Connected!");
    }

    mongoClient.close();
    console.log("Closed!");
});

回到虛擬機執行

$ node mongoTest.js
Connected!
Closed!

接著用另外一種連接方式,介紹 CRUD 的操作:

var mongoClient = require('mongodb').MongoClient;

mongoClient.connect('mongodb://localhost:27017/testDB', function(err, db) {
    if(err) throw err;

    // Data
    var todo1 = {todo: "Buy books", time: "2014/10/11", who: "myself"};
    var todo2 = {todo: "Buy milk", time: "2014/10/15", who: "brother"};
    var todo3 = {todo: "Wash cats", time: "2014/11/21", who: "myself"};

    var collection = db.collection('todoTest');
    var where = {todo: "Buy milk"};

    // 新增資料
    collection.insert(todo1, function(err, docs) {
        console.log(docs);
    });

    collection.insert(todo2, function(err, docs) {
        console.log(docs);
    });

    collection.insert(todo3, function(err, docs) {
        console.log(docs);
    });

    // 更新資料
    collection.update(where, { $set: { time: "2014/12/25"} }, function(err) {
        console.log(err);
    });

    // 刪除某筆資料
    collection.remove(where, function(err) {
        console.log(err);
    });

    // 查詢某筆資料
    collection.find(where).toArray(function(err, results) {
        console.dir(results);
    });

    // 查詢所有資料
    collection.find().toArray(function(err, results) {
        console.dir(results);
    });
});

請注意,以上操作由於 javascript async 特性的關係,

每個操作是會同時間送出,不同時間回送,看操作的運算時間而定

因此若要依順序性的話,一是使用 callback,二是使用 async.js

後面應該會提到 XD

將這些程式碼存到 js file 裏,將某些行先註解掉,執行看看就可以略知一二了,

可以同時搭配終端機直接到 DB 查看

p.s. 大家可能會覺得這樣的方式很麻煩,MongoDB 有沒有好用的 client 來管理 DB 呢

我推薦 RoboMongo,多平台,且可以直接輸入指令,蠻方便的,

那如果是用我們現在的虛擬機的方式,要如何使用 RoboMongo ?

首先,虛擬機的 DB 必須先開啟外部網路可以連線,

注意! 我們目前並沒有創立使用者帳號密碼,不需要驗證即可進入 DB,這樣的做法只限於 demo, 與虛擬機中使用

正式環境還是必須建立使用者帳號密碼

先進到虛擬機更改 db 設定:

$ sudo nano /etc/mongod.conf

將 bind_ip = 0.0.0.0

按下 ctrl+x 選擇 Y 存檔

重開 mongodb

$ sudo service mongod restart

若已經下載過 RoboMongo,開啟並輸入欲連線的 DB 設定:

就可以連進去管理了!

再次提醒,這樣的做法只限於虛擬機及 demo 中測試

正式環境要嘛建立使用者帳號密碼

要嘛就是讓 DB 只限本機存取,請記住這件事情哦~