Day24 DB-NodeJS中的mongoDB

昨天讲了关联式资料库的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


<<:  Day24 React useContext-在子元件使用context

>>:  day24: compose

【DAY 23】制作属於你的第一个应用程序 - Microsoft Power Apps

哈罗大家好~ 自从智慧型手机崛起之後,随着应用程序枝开叶散,我们的生活越来越离不开行动装置,甚至也逐...

Kaggle机器学习进阶课程总结:

课程主要是在於更好的优化data transform的时候data本身的优化处理: Permutat...

Day6 职训(机器学习与资料分析工程师培训班): PHP连接SQL

上午: Python程序设计 延续昨日课程,今日从流程控制开始,课程中老师也有出几个练习题让同学试着...

【把玩Azure DevOps】Day17 CI/CD从这里:Pipeline设定Schedule,每日晚上排程执行

现在有不少的软件会有一个特殊的版本叫Nightly,从字面上的意思就可以得知是指每个晚上发行的版本,...

Ruby基本介绍(七) && missing-number

本篇音乐分享 本篇文章会提到的 上一篇衍生题:include,与extend差异? missing-...