1. mongoose設置默認值
1.1 Schema
中未定義的字段,其數據不能被添加
在上一篇文章里說到,首先要定義一個Schema
,作為對數據庫集合的各個字段類型的規范定義,此外,在添加數據時,如果添加的數據字段沒有在Schema
中定義,那么該字段數據不會被添加到集合里:
/*定義Schema*/ const NewsSchema = mongoose.Schema({ title: String, author: String, pic:String, content: String, status: Number }); /*定義News模型*/ const News = mongoose.model('News', NewsSchema, 'news'); /*實例化模型,添加數據*/ const news = new News({ title:'最新新聞', author:'joyitsai', pic:'03.png', content:'新聞內容', status: 1, views: 300 }); news.save((err, docs)=>{ if(err){ console.log('添加數據出錯'); return; } console.log(docs); });
上面再添加數據時,views:200
字段的數據再Schema
中並沒有定義,那么再添加數據時,這個字段的數據並不會被加到集合中,查看一下news
集合的數據:
> db.news.find() { "_id" : ObjectId("5cf62d5333e8ab297050eb97"), "title" : "最新新聞", "author" : "joyitsai", "pic" : "03.png", "content" : "新聞內容", "status" : 1, "__v" : 0 }
1.2 Schema
定義時,指定默認值:
在Schema
中定義字段的默認值,添加數據時,如果該字段數據沒有被添加,那么mongoose
會自動使用Schema
中該字段的默認值作為數據添加到集合里:
/*定義Schema*/ const NewsSchema = mongoose.Schema({ title: String, author: String, pic:String, content: String, /*指定字段的type、默認值*/ status: { type: Number, default: 1 } }); const News = mongoose.model('News', NewsSchema, 'news'); /*添加數據,不添加status字段時,會自動使用默認值添加*/ const news = new News({ title:'最新新聞007', author:'joyitsai', pic:'07.png', content:'新聞內容007' }); news.save((err, docs)=>{ if(err){ console.log('添加數據出錯'); return; } console.log(docs); });
查看剛剛添加的數據,會發現數據中有status:1
字段:
> db.news.find() { "_id" : ObjectId("5cf630516b0b333d40a59f31"), "status" : 1, "title" : "最新新聞007", "author" : "joyitsai", "pic" : "07.png", "content" : "新聞內容007", "__v" : 0 }
2. mongoose模塊化:
在每次使用mongoose來操作數據庫時,都要寫連接數據庫
、定義Schema
、定義模型
,顯得很繁瑣。那么現在就用模塊化來解決這個問題。
簡單說,就是把連接數據庫
、定義Schema
、定義模型
都寫成獨立的模塊,在相應功能代碼中直接引入模塊,進行數據庫操作即可。
2.1 連接數據庫——模塊化:
// db.js const mongoose = require('mongoose'); mongoose.connect( 'mongodb://127.0.0.0:27017/databaseName', {useNewUrlParser: true,}, (err)=>{ if(err){ console.log('數據庫連接失敗'); return; } } ) module.exports = mongoose;
2.2 定義Schema,定義模塊:
在定義Schema
和模塊的代碼中導入上面連接成功后的mongoose模塊:
// news.js const mongoose = require('./db'); // 定義Schema const NewsSchema = mongoose.Schema({ title: String, author: String, pic:String, content: String, status: { type: Number, default: 1 } }); // 導出News模型 const News = mongoose.model('News', NewsSchema, 'news'); module.exports = News;
2.3 引入news.js
模型,直接操作數據庫:
//insertData.js const News = require('./myDatabase/news'); const news = new News({ title:'最新新聞007', author:'joyitsai', pic:'07.png', content:'新聞內容007' }); news.save((err, docs)=>{ if(err){ console.log('添加數據出錯'); return; } console.log(docs); });
以上就實現了對mongoose連接數據庫
、定義Schema和定義模型
的基本模塊化就完成了。
3. 模塊化性能測試
現在有人可能會對這種模塊化的性能產生疑問,因為如果要對多個集合的數據進行操作,必然要在同一個文件中導入多個模型。
然而,每次導入一個模型,上層都會導入一次數據庫連接
的模塊,會不會導致導入多個模型時數據庫重復連接,而嚴重影響程序執行性能。
其實,mongoose在內部給我們解決了這個問題,即使在一次性導入多個模型,只由第一次導入時的模塊擔任數據庫連接工作,下面就測試一下:
//假設又封裝了一個User集合模型 console.time('news') const News = require('./myDatabase/news'); const news = new News({ title:'最新新聞007', author:'joyitsai', pic:'07.png', content:'新聞內容007' }); news.save((err, docs)=>{ if(err){ console.log('添加數據出錯'); return; } console.log(docs); }); // 測試向news集合中添加數據的時間 console.timeEnd('news'); console.time('user') const User = require('./myDatabase/user'); const user = new User({ name:'zhangsan', age: 36, pic:'07.png', }); user.save((err, docs)=>{ if(err){ console.log('添加數據出錯'); return; } console.log(docs); }); // 測試向user集合中添加數據的時間 console.timeEnd('user');
下面看一下測試結果:
news: 341.740ms user: 2.666ms { status: 1, _id: 5cf67e2fc3aa2254349ed978, title: '最新新聞007', author: 'joyitsai', pic: '07.png', content: '新聞內容007', __v: 0 } { status: 1, _id: 5cf67e2fc3aa2254349ed979, name: 'zhangsan', age: 36, pic: '07.png', __v: 0 }
很顯然,在第一次引入News
模型的用時是第二次引入User
模型的150倍,這驗證了在多次引入模型的情況下,並不會重復連接數據庫。