1、mongoose索引
索引是對數據庫表中一列或多列的值進行排序的一種結構,能夠讓咱們查詢數據庫變得更快。MongoDB的索引幾乎與傳統的關係型數據庫如出一轍,這其中也包括一些基本的查詢優化技巧。javascript
mongoose中除了之前建立索引的方式,咱們也能夠在定義Schema的時候指定建立索引。java
設置索引是爲了優化查詢速度,基本用不着的字段就不用設置索引。數據庫
news.js sn字段設置索引。index:truemongoose
var mongoose = require("./db.js"); // 定義數據表(集合的)映射,注意:字段名稱必須和數據庫保持一致 var NewsSchema = mongoose.Schema({ // title: String, title: { type: String, trim: true }, url: { type: String, set(url) { if (!url) return url; if (url.indexOf("http://") != 0 && url.indexOf("https://") != 0) { url = "http://" + url; } return url; }, get: function(url) { if (!url) return url; if (url.indexOf("http://") != 0 && url.indexOf("https://") != 0) { url = "http://" + url; } return url; } }, author: String, pic: String, content: String, status: { type: Number, dafault: 1 }, sn: { type: String, index: true } }); module.exports = mongoose.model("News", NewsSchema, "news");
由圖可知,2個索引。優化
2、擴展靜態方法。
var mongoose = require("./db.js"); // 定義數據表(集合的)映射,注意:字段名稱必須和數據庫保持一致 var NewsSchema = mongoose.Schema({ // title: String, title: { type: String, trim: true }, url: { type: String, set(url) { if (!url) return url; if (url.indexOf("http://") != 0 && url.indexOf("https://") != 0) { url = "http://" + url; } return url; }, get: function(url) { if (!url) return url; if (url.indexOf("http://") != 0 && url.indexOf("https://") != 0) { url = "http://" + url; } return url; } }, author: String, pic: String, content: String, status: { type: Number, dafault: 1 }, sn: { type: String, index: true } }); NewsSchema.statics.findBySn = function(sn, cb) { // 經過find方法獲取sn的數據,this關鍵字獲取當前的model this.find({ sn: sn }, function(err, docs) { cb(err, docs); }); }; module.exports = mongoose.model("News", NewsSchema, "news");
var NewsModel = require("./model/news.js"); var news = new NewsModel({ title: " 我是一個國際新聞12345678 ", url: "www.hommsun.com", author: "張三", pic: "http://xxx.com/x.png", cintent: "我是一個內容11", sn: 12345678 }); news.save(function(err) { if (err) { console.log(err); return; } NewsModel.find({}, function(err, docs) { if (err) { console.log(err); return; } console.log(docs); }); }); NewsModel.findBySn("1234567", function(err, docs) { if (err) { console.log(err); return; } console.log(docs); });
3、擴展實例方法
var mongoose = require("./db.js"); // 定義數據表(集合的)映射,注意:字段名稱必須和數據庫保持一致 var NewsSchema = mongoose.Schema({ // title: String, title: { type: String, trim: true }, url: { type: String, set(url) { if (!url) return url; if (url.indexOf("http://") != 0 && url.indexOf("https://") != 0) { url = "http://" + url; } return url; }, get: function(url) { if (!url) return url; if (url.indexOf("http://") != 0 && url.indexOf("https://") != 0) { url = "http://" + url; } return url; } }, author: String, pic: String, content: String, status: { type: Number, dafault: 1 }, sn: { type: String, index: true } }); NewsSchema.methods.printF = function() { console.log("我是一個實例方法") }; module.exports = mongoose.model("News", NewsSchema, "news");
調用:ui
var NewsModel = require("./model/news.js"); var news = new NewsModel({ title: " 我是一個國際新聞12345678 ", url: "www.hommsun.com", author: "張三", pic: "http://xxx.com/x.png", cintent: "我是一個內容11", sn: 12345678 }); news.printF(); news.save(function(err) { if (err) { console.log(err); return; } NewsModel.find({}, function(err, docs) { if (err) { console.log(err); return; } console.log(docs); }); }); // NewsModel.findBySn("1234567", function(err, docs) { // if (err) { // console.log(err); // return; // } // console.log(docs); // });