昨天講了關聯式資料庫的MySQL,今天要接著介紹NoSQL中受歡迎的mongoDB,以及在NPM裡mongoDB的相關套件與使用方式,
mongoDB是一種文件導向的資料庫管理系統,其文件資料模型支援JSON格式與快速的查詢語法使工程師易於學習與使用,且mongoDB具備免費的社群版本與支援多種不同程式語言驅動,也因此受到許多知名企業青睞,如:SEGA、Google、EA等,可透過MongoDB Compass介面或Terminal進行資料庫管理。
NodeJS中常用的NPM套件有mongoose與mongodb。mongodb是mongoDB的原生伺服器,而mongoose屬於物件塑模工具,透過mongoose可以定義資料文件的schema,使mongoDB的資料庫管理與建立更加便利,今天的練習以mongoose套件為主。
require()
引入。let mongoose = require("mongoose");
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
var Person;
mongoose.connect("mongodb://localhost:27017/nodeProj")
.then(()=>{},(err)=>{console.log(err)});
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)});
Person
model建構新的資料內容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)});
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();
});
以前從來沒有接觸過NoSQL的資料庫,mongoDB的學習可以說是獲益良多加上飽受瓶頸,從Server的建置、資料庫的邏輯加上工具的使用都花了一些時間,也不可否定他在使用上有其便利的地方,例如建立連線時就將資料庫一併建立、除了範例中先建立schema,也可以在資料還不確定的情況下直接建立資料等。
https://mongoosejs.com/docs/connections.html#buffering
https://www.npmjs.com/package/mongoose
https://stackoverflow.com/questions/28712248/difference-between-mongodb-and-mongoose
https://zh.wikipedia.org/wiki/MongoDB