iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 18
2
Modern Web

Node.JS - 30 天入門學習筆記系列 第 18

Day18 - Node.JS 串接 MongoDB (含CRUD)

今天,來到鐵人賽第十八天。
今天的天氣超級好呀!
話說台北馬拉松也在今天早上舉行。
想起了小編的去年此時,在努力跑21公里。
今年此時,坐在電腦前參加鐵人賽。
好吧,我們繼續完成今日的目標!

之前,我們已經寫了 MongoDB 如何安裝與執行。

因為,整個 MongoDB算是一套課程,小編在這裡,先著重Node.js概括的學習,閒有餘力,再深入MongoDB。

關於mongodb比較基礎且重要的,可以先參考:
MongoDB CRUD Operations :它裡面教你如何在mongodb裡 新增/讀取/更新/刪除 的基本資料操作。

所以,這邊,小編直接參考 access-mongodb-in-nodejs 完成此站這一系列的Node.JS學習。
那,我們開始吧!

安裝Mongo DB driver

同ms-sql的串接方式,我們需要安裝mongodb-driver,在command line 輸入:
npm install mongodb -g
cd myapp
npm install mongodb --save

我們打開package.json 看,安裝了 mongodb 2.2.11 :(注意,這裡安裝的是driver,不是mongodb喔!)
http://ithelp.ithome.com.tw/upload/images/20161218/20103526u5TYvUBAnk.png

啟動mongoDB Server

接著,我們要啟動我們的mongoDB Server,參考 Day17 - MongoDB 安裝設定
可在command prompt 輸入:

mkdir testdb    /*也可以直接在app裡建一個測試的數據資料庫存放位置*/
mongod --dbpath c:\myapp\testdb

或是,如果已經設定好config的mongodb service,那就直接使用:
net start mongodb
註:這邊可能要用系統管理員身份執行command prompt 才可以正確執行!

Node.js 連接MongoDB

moserver.js

var MongoClient = require('mongodb').MongoClient;
 
// Connect to the db
MongoClient.connect("mongodb://localhost:27017/mymondb", function (err, db) {
  if(err) throw err;
  //Write databse Insert/Update/Query code here..
  console.log('mongodb is running!');
  db.close(); //關閉連線
});

這個例子裡,我們載入mongodb module,並且使用MongoClient物件。
接著,使用 MongoClient.connect()方法,以取得MongoDB資料庫的引用。
其中,URL的部份,"mongodb://localhost:27017/mymondb",指向你之前指定的MongoDB資料夾位置c:\myapp\testdb。
connect()方法,會回應一個 database參考 ,如果所描述的database—(這裡的例子叫做mymondb) 存在,就連線;無就自動新增。

我們來看看,以上例子,如果有成功連線時的執行結果:
http://ithelp.ithome.com.tw/upload/images/20161218/20103526TGccPQL5jM.png

當我們建立了Node.js 與 MongoDB 連線後,可以使用connect()裡的回呼函式其db參數,開始做一些 新增Insert(Create) / 更新Update / 查詢Query(Retrieve/Read) / 刪除Delete 資料 的動作。

新增(Insert/Create)資料

現在,我們來為我們的資料庫新增一些資料。

moncreate.js

var MongoClient=require('mongodb').MongoClient;
 
MongoClient.connect("mongodb://localhost:27017/mymondb",function(err,db){
 
   if(err) throw err;
   //Write databse Insert/Update/Query code here..
 
   db.collection('Persons',function(err,collection){
    collection.insert({ id:1, firstName:'Steve', lastName:'Jobs' });
    collection.insert({ id:2, firstName:'Bill', lastName:'Gates' });
    collection.insert({ id:3, firstName:'James', lastName:'Bond' });
 
    collection.count(function(err,count){
        if(err) throw err;
        console.log('Total Rows:'+count);
    });
  });
  db.close(); //關閉連線
});

在這個例子中,我們用 db.collection方法去新增並且獲取collections的一些資訊,如總筆數。
別忘了,在介紹MongoDB與關聯式資料庫的關係時,我們知道collection 其實就是 table。而這個例子裡,我們在 mymondb 資料庫 建立了一個 Persons – collection(資料表),並且,為這Persons資料表新增了3筆資料,我們在這裡叫documents (列)

結果如圖:
http://ithelp.ithome.com.tw/upload/images/20161218/20103526SFGvTM08Ti.png

我們也可以使用 mongo shell,查詢:
http://ithelp.ithome.com.tw/upload/images/20161218/20103526PS8bF06nRq.png

更新(Update)資料

做完了新增,如果我們想要更新其中 id:1 的資料。

monupdate.js

var MongoClient=require('mongodb').MongoClient;
 
MongoClient.connect("mongodb://localhost:27017/mymondb", function(err,db){
   db.collection('Persons',function(err,collection){
   //collection.update
   //第一個參數是要更新的條件,第二個參數$set:更新的欄位及內容.
   //第三個參數writeConcern,第四個參數執行update後的callback函式
   collection.update({id:1},{ $set: { firstName:'James', lastName:'Gosling'} },
     {w:1}, function(err, result){
         if(err) throw err;
         console.log('Document Updated Successfully');
        });
    });
    db.close(); //關閉連線
});

關於第三個參數,writeConcern
網站:http://kyfxbl.iteye.com/blog/1952941
有詳細說明,可以去參考看看,我們這裡使用,常用的 {w:1} 即可,不用也沒差!

我們在command prompt 執行 node,並且在mongo shell 可以看到更新前與更新後的資料,如圖:
http://ithelp.ithome.com.tw/upload/images/20161218/20103526IeOVf9l8P5.png

刪除(Delete)資料

現在,我們想要刪除 id:2 的Document(Row)。

mondelete.js

var MongoClient=require('mongodb').MongoClient;
 
MongoClient.connect("mongodb://localhost:27017/mymondb",function(err,db){
    db.collection('Persons',function(err,collection){
        collection.remove({id:2},{w:1},function(err,result){
            if(err) throw err;
            console.log('Document Removed Successfully!');
        });
    });
    db.close(); //關閉連線
});

我們在command prompt 執行 node,並且在mongo shell 可以看到刪除前與刪除後的資料,如圖:
http://ithelp.ithome.com.tw/upload/images/20161218/20103526b9rFKTLagB.png

查詢(Query)資料

維持 Persons 新增後的狀態!即原本的3筆!現在,我們想要找 firstName:"Bill"

monquery.js

var MongoClient=require('mongodb').MongoClient;
 
MongoClient.connect("mongodb://localhost:27017/mymondb",function(err,db){
    db.collection("Persons",function(err,collection){
        collection.find({firstName:"Bill"}).toArray(function(err,items){
            if(err) throw err;
            console.log(items);
            console.log("We found "+items.length+" results!");
        });
 
    });
    db.close(); //關閉連線
});

我們在command prompt 執行 node,可以看到被擷取出來的結果,如圖:
http://ithelp.ithome.com.tw/upload/images/20161218/20103526mP0Iegaczr.png

!!重要!!

關於更多Collection的操作,可以參考:Collection Methods,特別在使用查詢find,有不同於以往SQL 的使用語法。


上一篇
Day17 - MongoDB 安裝設定
下一篇
Day19 - 樣版引擎及Jade 樣版引擎的安裝與使用
系列文
Node.JS - 30 天入門學習筆記32

尚未有邦友留言

立即登入留言