MongoDB基礎六:Mongoose 索引弄跌、內(nèi)置CURD 方法、擴展靜態(tài)方法和實例方法

一尝苇、Mongoose 索引

索引是對數(shù)據(jù)庫表中一列或多列的值進行排序的一種結構铛只,可以讓我們查詢數(shù)據(jù)庫變得更快埠胖。

1.1 創(chuàng)建索引

mongoose 中除了以前創(chuàng)建索引的方式,我們也可以在定義Schema時創(chuàng)建索引:

const NewsSchema = mongoose.Schema({
    news_id:{
        type:Number,
        // 唯一索引
        unique: true
    },
    title: {
        type:String,
        // 普通索引
        index: true
    },
    author: String,
});

const News = mongoose.model('News', NewsSchema, 'news');
module.exports = News;

上面代碼中淳玩,通過在Schema的字段中定義unique: true創(chuàng)建唯一索引直撤,和index: true創(chuàng)建一般索引。

1.2 測試索引查詢數(shù)據(jù)的性能

首先看一下沒有索引時(將上面代碼中unique: trueindex: true注釋掉)查詢數(shù)據(jù)的時間(news集合中有100萬條數(shù)據(jù)):

console.time('news');
News.find({title: '新聞200000'}, (err, docs)=>{
    if(err) return console.log(err);
    console.log(docs);
    console.timeEnd('news');
})

查詢用時:

[ { _id: 5cf7795fb1f4664f499f265c,
    news_id: 200000,
    title: '新聞200000',
    author: 'joyitsai' } ]
news: 469.795ms

當依照上面創(chuàng)建索引之后蜕着,再對這條數(shù)據(jù)進行查詢谊惭,查詢用時:

[ { _id: 5cf77921b1f4664f499c673c,
    news_id: 20000,
    title: '新聞20000',
    author: 'joyitsai' } ]
news: 92.108ms

在mongoose中使用索引查詢數(shù)據(jù)的性能對于沒有索引的情況下有了5倍左右的提升,但沒有在mongo命令行中查詢時的性能好侮东。

二圈盔、Mongoose 內(nèi)置CURD

  • Model.deleteMany()
  • Model.deleteOne()
  • Model.find()
  • Model.findById()
  • Model.findByIdAndDelete()
  • Model.findByIdAndRemove()
  • Model.findByIdAndUpdate()
  • Model.findOne()
  • Model.findOneAndDelete()
  • Model.findOneAndRemove()
  • Model.findOneAndUpdate()
  • Model.replaceOne()
  • Model.updateMany()
  • Model.updateOne()

三、擴展Mongoose CURD 方法

3.1 在Schema上自定義靜態(tài)方法:

在定義的Schema上通過Schema.statics.yourFind封裝自己的數(shù)據(jù)查找方法悄雅,方便后期數(shù)據(jù)查找工作驱敲。callback為數(shù)據(jù)查找完成后的回調(diào)函數(shù),回調(diào)函數(shù)中可以進行錯誤處理或者數(shù)據(jù)處理等操作:

const NewsSchema = mongoose.Schema({
    news_id:{
        type:Number,
        // 唯一索引
        unique: true
    },
    title: {
        type:String,
        // 普通索引
        index: true
    },
    author: String
});

// 通過Schema來自定義模型的靜態(tài)方法宽闲,自定義數(shù)據(jù)查找的方法
NewsSchema.statics.findByNewsId = function(news_id, callback){
    //this指向當前模型众眨,調(diào)用模型上的find()方法,封裝自己的靜態(tài)方法
    this.find({news_id: news_id}, function(err, docs){
        //數(shù)據(jù)查找完成后容诬,調(diào)用callback娩梨,對錯誤信息或者查找到的數(shù)據(jù)進行處理
        callback(err, docs);
    })
}

const News = mongoose.model('News', NewsSchema, 'news');
module.exports = News;

然后在相關功能代碼中,就可以通過News.findByNewsId()來查找數(shù)據(jù)了:

News.findByNewsId(20000, (err, docs)=>{
    if(err) return console.log(err);
    console.log(docs);
});

查找結果如下:

[ { _id: 5cf77921b1f4664f499c673c,
    news_id: 20000,
    title: '新聞20000',
    author: 'joyitsai' } ]
3.2 在Schema上自定義實例方法:

實例方法是通過Schema.methods.yourMethod來定義的览徒,其中this指向了NewsSchema對應模型的實例:

NewsSchema.methods.print = function(){
    console.log('這是一個實例方法');
    console.log(this.news_id);
}

調(diào)用實例方法:

// 對News模型實例化
const news = new News({
    news_id: 1,
    title: '新聞1',
    author: 'joyitsai'
})

//在實例上調(diào)用實例方法
news.print();

調(diào)用實例方法后的結果對應了實例方法的定義:

這是一個實例方法
新聞1

實例方法不太常用狈定,但如果你在項目中需要對數(shù)據(jù)模型實例化之后,進行一些特殊的操作习蓬,可以通過實例化方法來執(zhí)行纽什,提高功能性操作的效率。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末躲叼,一起剝皮案震驚了整個濱河市芦缰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌枫慷,老刑警劉巖让蕾,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異或听,居然都是意外死亡探孝,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門神帅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來再姑,“玉大人,你說我怎么就攤上這事找御≡疲” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵霎桅,是天一觀的道長栖疑。 經(jīng)常有香客問我,道長滔驶,這世上最難降的妖魔是什么遇革? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮揭糕,結果婚禮上萝快,老公的妹妹穿的比我還像新娘。我一直安慰自己著角,他們只是感情好揪漩,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著吏口,像睡著了一般奄容。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上产徊,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天昂勒,我揣著相機與錄音,去河邊找鬼舟铜。 笑死戈盈,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的谆刨。 我是一名探鬼主播奕谭,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼痴荐!你這毒婦竟也來了血柳?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤生兆,失蹤者是張志新(化名)和其女友劉穎难捌,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鸦难,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡根吁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了合蔽。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片击敌。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖拴事,靈堂內(nèi)的尸體忽然破棺而出沃斤,到底是詐尸還是另有隱情圣蝎,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布衡瓶,位于F島的核電站徘公,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏哮针。R本人自食惡果不足惜关面,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望十厢。 院中可真熱鬧等太,春花似錦、人聲如沸蛮放。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽筛武。三九已至缝其,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間徘六,已是汗流浹背内边。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留待锈,地道東北人漠其。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像竿音,于是被迫代替她去往敵國和親和屎。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 參考深入淺出mongoose 連接mongoose mongoose連接數(shù)據(jù)庫有兩種方式第一種: 第二種: mon...
    bacbcc94613b閱讀 12,309評論 1 27
  • Mongodb 配置選項 通常在mongod.conf中 配置文件 設置了配置文件后啟動時以自定義的配置文件啟動:...
    AkaTBS閱讀 1,072評論 0 6
  • 原文地址 本文簡單的介紹了數(shù)據(jù)庫春瞬,以及如何在 Node/Express 中應用他們柴信。之后展示如何使用Mongoos...
    前端幼兒班閱讀 5,151評論 1 5
  • 圖片發(fā)自簡書App①那年暑假擦肩而過的心跳? 我叫齊風,是個外表看似冷酷內(nèi)心無比溫暖并且不折不扣的學霸宽气。我有一個妹...
    似最初閱讀 307評論 0 0
  • 2015-12-14 華杉 工欲善其事随常,必先利其器。君欲求進步萄涯,必先擇其友绪氛。良師益友,就是進步之器涝影。張居正算是把這...
    郁萍閱讀 237評論 0 0