iT邦幫忙

2021 iThome 鐵人賽

DAY 24
0
自我挑戰組

學習NodeJS的30天系列 第 24

Day24 DB-NodeJS中的mongoDB

  • 分享至 

  • xImage
  •  

昨天講了關聯式資料庫的MySQL,今天要接著介紹NoSQL中受歡迎的mongoDB,以及在NPM裡mongoDB的相關套件與使用方式,

mongoDB

mongoDB是一種文件導向的資料庫管理系統,其文件資料模型支援JSON格式與快速的查詢語法使工程師易於學習與使用,且mongoDB具備免費的社群版本與支援多種不同程式語言驅動,也因此受到許多知名企業青睞,如:SEGA、Google、EA等,可透過MongoDB Compass介面或Terminal進行資料庫管理。

https://ithelp.ithome.com.tw/upload/images/20211009/20139980LBTsDTCumR.png

mongoose與其使用方式

NodeJS中常用的NPM套件有mongoose與mongodb。mongodb是mongoDB的原生伺服器,而mongoose屬於物件塑模工具,透過mongoose可以定義資料文件的schema,使mongoDB的資料庫管理與建立更加便利,今天的練習以mongoose套件為主。

  1. 安裝mongoose套件與使用require()引入。

https://ithelp.ithome.com.tw/upload/images/20211009/20139980meAnx3u5Xj.png

let mongoose = require("mongoose");
  1. mongoose.connect()建立與mongoDB伺服器的連線,並設置兩個回呼函式:連線完成執行內容與印出連線錯誤訊息。在mongoose套件中,可以使用connect()createConnection()建立連線,但mongoose套件支援在連線尚未建立時就可以先定義schema,為了避免產生找不到定義的錯誤,這裡使用內建Promise的connect()方法,讓連線的建立與schema定義以非同步的方式執行。
mongoose.connect("mongodb://localhost:27017/nodeProj")
  .then(()=>{},(err)=>{console.log(err)});
// 連線字串格式 mongodb:[user:pass@]address:port/database
  1. 在連線外建立一個全域變數Person作為資料庫model的handler,以使在連線完成後建立的資料庫模型能在其他中介層中被使用。
var Person;
mongoose.connect("mongodb://localhost:27017/nodeProj")
  .then(()=>{},(err)=>{console.log(err)});
  1. 於連線完成的回呼函式中建立新的資料庫schema,並指派給Person一個新的model。
var Person;
mongoose.connect("mongodb://localhost:27017/nodeProj")
  .then(
  ()=>{
    let personSchema = new mongoose.schema({
      firstName: String,
      lastName: String,
      address: String
    });
    Person = mongoose.model("Person", personSchema);
  },(err)=>{console.log(err)});
  1. 再以Personmodel建構新的資料內容k、h並存進資料庫,儲存時提供印出錯誤訊息或完成儲存訊息的回呼函式。
var Person;
mongoose.connect("mongodb://localhost:27017/nodeProj")
  .then(
  ()=>{
    let personSchema = new mongoose.schema({
      firstName: String,
      lastName: String,
      address: String
    });
    Person = mongoose.model("Person", personSchema);
    
    let k = Person({
      firstName: "chw",
      lastName: "k",
      address: "啦啦路123號"
    });
    
    let h = Person({
      firstName: "chw",
      lastName: "h",
      address: "啦啦路123號"
    });
    
    k.save((err)=>{
      if(err) console.log(err);
      console.log("save person");
    });
    
    h.save((err)=>{
      if(err) console.log(err);
      console.log("save person");
    });
  },(err)=>{console.log(err)});
  1. 在連線外加入中介層,於請求頁面時執行,以Person.find()可以取得mongoDB中的Person資料。
app.use("/", (req, res, next)=>{
  console.log(`Requst Url: ${req.url}`);
  Person.find({}, (err, users)=>{
    if(err) console.log(err);
    console.log(users);
  });
  next();
});
  1. 程式啟動時,建立連線的程式碼依序被執行,可以從Terminal看到儲存完成的訊息。

https://ithelp.ithome.com.tw/upload/images/20211009/20139980oVaubkHPmA.png

  1. 從瀏覽器請求頁面時,Terminal會印出中介層查詢的資訊,從MongoDB Compass中也可以看到建立好的資料,是以JSON格式存放。

https://ithelp.ithome.com.tw/upload/images/20211009/20139980lWFWHnVmcr.png

https://ithelp.ithome.com.tw/upload/images/20211009/20139980wtYr2Qu05p.png

小結

以前從來沒有接觸過NoSQL的資料庫,mongoDB的學習可以說是獲益良多加上飽受瓶頸,從Server的建置、資料庫的邏輯加上工具的使用都花了一些時間,也不可否定他在使用上有其便利的地方,例如建立連線時就將資料庫一併建立、除了範例中先建立schema,也可以在資料還不確定的情況下直接建立資料等。

參考資料

https://mongoosejs.com/docs/connections.html#buffering

https://stackoverflow.com/questions/46882181/mongoose-callback-not-executed-when-using-mongoose-createconnection

https://stackoverflow.com/questions/31126045/is-it-possible-to-create-a-new-database-in-mongodb-with-mongoose

https://www.npmjs.com/package/mongoose

https://www.mongodb.com

https://stackoverflow.com/questions/28712248/difference-between-mongodb-and-mongoose

https://zh.wikipedia.org/wiki/MongoDB


上一篇
Day23 DB-NodeJS中的MySQL
下一篇
Day25 NodeJS中的前端框架 I
系列文
學習NodeJS的30天30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言