MongoDB快速入門教程 (4.3)

4.3.Mongoose模塊化

#4.3.1.為什么要進(jìn)行模塊化拆分赘被?

模塊化拆分的目的是為了代碼的復(fù)用衰伯,讓整個(gè)項(xiàng)目的結(jié)構(gòu)更加清晰,舉個(gè)例子:當(dāng)數(shù)據(jù)庫(kù)中的集合變多的時(shí)候墅垮,例如有課程惕医、訂單、分類算色、教師等多個(gè)集合抬伺,我們將每個(gè)集合的代碼拆分到不同的模塊,這樣項(xiàng)目結(jié)構(gòu)會(huì)清晰很多灾梦,同時(shí)峡钓,這些模塊都要連接數(shù)據(jù)庫(kù)齐鲤,每個(gè)模塊都去連接一遍數(shù)據(jù)庫(kù)顯然是不合理的寫法,正確的做法是把連接數(shù)據(jù)庫(kù)的代碼單獨(dú)拆分出來椒楣,供各個(gè)模塊連接數(shù)據(jù)庫(kù)的時(shí)候使用

#4.3.2.拆分步驟

#1.把數(shù)據(jù)庫(kù)連接代碼拆分出去

在項(xiàng)目目錄下新建model目錄给郊,在model目錄下新建db.js文件,這個(gè)文件用于存放數(shù)據(jù)庫(kù)連接代碼

model/db.js代碼

// 1.引入mongoose
const mongoose = require('mongoose')
// 2.連接數(shù)據(jù)庫(kù)
mongoose.connect('mongodb://testadmin:nodeing123@127.0.0.1:27017/test', {useNewUrlParser: true}, (err) => {
  if (err) {
    console.log(err)
    return
  }
  console.log('數(shù)據(jù)庫(kù)連接成功')
})

module.exports = mongoose

#2.把Schema的定義和模型的創(chuàng)建拆分出去

model/users.js中的代碼

let mongoose = require('./db')
// 3.定義Schema捧灰,例如:現(xiàn)在需要操作user集合(表)淆九,我們就需要給這個(gè)集合定義一個(gè)對(duì)應(yīng)的Schema

let UserSchema = mongoose.Schema({
  name: String,
  age: Number,
  status: Number,
  gender: {
    type: String,
    default: '男'
  }
})

// 4.創(chuàng)建模型

let User = mongoose.model('User', UserSchema)

module.exports = User

#3.在需要的地方使用上面拆除去的模塊

新建一個(gè)app.js來測(cè)試是否可用

let UserModel = require('./model/users')

// 增加數(shù)據(jù)
let UserObj = new UserModel({
  name: '張三',
  age: 20,
  status: 0
})
UserObj.save()

項(xiàng)目結(jié)構(gòu)圖:

image

#4.4.Mongoose預(yù)處理保存的數(shù)據(jù)

在定義Schema的時(shí)候,可以帶上一些預(yù)定義的處理器毛俏,可以幫助我們處理需要保存到數(shù)據(jù)庫(kù)的數(shù)據(jù)

#4.4.1.lowercase

定義Schema的時(shí)候帶上lowercase炭庙,可以把需要保存的數(shù)據(jù)轉(zhuǎn)成小寫

let UserSchema = mongoose.Schema({
  name: {
    type: String,
    lowercase: true
  },
  age: Number,
  status: Number,
  gender: {
    type: String,
    default: '男'
  }
})

下面例子中name字段的值為全大寫:

// 增加數(shù)據(jù)
let UserObj = new UserModel({
  name: 'NONDEING',
  age: 28,
  status: 0
})
UserObj.save()

因?yàn)槭褂昧薼owercase,所以保存到數(shù)據(jù)庫(kù)中的數(shù)據(jù)是經(jīng)過處理了的:

image

#4.4.2.uppercase

uppercase是將字段值轉(zhuǎn)成大寫煌寇,這個(gè)和lowercase類似

let UserSchema = mongoose.Schema({
  name: {
    type: String,
    uppercase: true
  },
  age: Number,
  status: Number,
  gender: {
    type: String,
    default: '男'
  }
})

保存數(shù)據(jù)的時(shí)候焕蹄,name值全為小寫:

// 增加數(shù)據(jù)
let UserObj = new UserModel({
  name: 'nodeing',
  age: 28,
  status: 0
})
UserObj.save()

保存到數(shù)據(jù)庫(kù)后,被轉(zhuǎn)成了大寫:

image

#4.4.3.trim

trim的作用是去除兩邊的空格


let UserSchema = mongoose.Schema({
  name: {
    type: String,
    uppercase: true
  },
  age: Number,
  status: Number,
  gender: {
    type: String,
    trim: true,
    default: '男'
  }
})

保存的數(shù)據(jù)如下:

// 增加數(shù)據(jù)
let UserObj = new UserModel({
  name: 'nodeing',
  age: 28,
  status: 0,
  gender: "   女   "
})

保存到數(shù)據(jù)庫(kù)后的結(jié)果如下:

image

更多預(yù)處理器可以查看文檔:https://cn.mongoosedoc.top/docs/schematypes.html

#4.4.4.自定義處理器

如果mongoose提供的預(yù)處理器沒辦法滿足你的需求阀溶,你也可以自定義預(yù)處理器腻脏,舉個(gè)例子:保存url的時(shí)候,我們規(guī)定必須保存http協(xié)議银锻,這個(gè)時(shí)候就需要自定義一個(gè)預(yù)處理器去滿足需求

需求詳解:

當(dāng)保存這樣的數(shù)據(jù): www.baidu.com  我們希望處理后的結(jié)果為:http://www.baidu.com

定義Schema的時(shí)候永品,代碼如下:


let UserSchema = mongoose.Schema({
  name: {
    type: String,
    uppercase: true
  },
  age: Number,
  status: Number,
  gender: {
    type: String,
    trim: true,
    default: '男'
  },
  pic: {
    type: String,
    set (params) {
      if (params.indexOf('http://') != 0 || params.indexOf('https://') !=0 ) {
        return "http://"+params
      }
      return params
    }
  }
})

保存的數(shù)據(jù)如下:

// 增加數(shù)據(jù)
let UserObj = new UserModel({
  name: 'nodeing',
  age: 28,
  status: 0,
  gender: "   女   ",
  pic: "www.baidu.com"
})

處理后的數(shù)據(jù)如下:

image
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市击纬,隨后出現(xiàn)的幾起案子鼎姐,更是在濱河造成了極大的恐慌,老刑警劉巖更振,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件炕桨,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡肯腕,警方通過查閱死者的電腦和手機(jī)献宫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來乎芳,“玉大人遵蚜,你說我怎么就攤上這事∧位螅” “怎么了?”我有些...
    開封第一講書人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵睡汹,是天一觀的道長(zhǎng)肴甸。 經(jīng)常有香客問我,道長(zhǎng)囚巴,這世上最難降的妖魔是什么原在? 我笑而不...
    開封第一講書人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任友扰,我火速辦了婚禮,結(jié)果婚禮上庶柿,老公的妹妹穿的比我還像新娘村怪。我一直安慰自己,他們只是感情好浮庐,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開白布甚负。 她就那樣靜靜地躺著,像睡著了一般审残。 火紅的嫁衣襯著肌膚如雪梭域。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,754評(píng)論 1 307
  • 那天搅轿,我揣著相機(jī)與錄音病涨,去河邊找鬼。 笑死璧坟,一個(gè)胖子當(dāng)著我的面吹牛既穆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播雀鹃,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼循衰,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了褐澎?” 一聲冷哼從身側(cè)響起会钝,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎工三,沒想到半個(gè)月后迁酸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡俭正,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年奸鬓,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掸读。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡串远,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出儿惫,到底是詐尸還是另有隱情澡罚,我是刑警寧澤,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布肾请,位于F島的核電站留搔,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏铛铁。R本人自食惡果不足惜隔显,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一却妨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧括眠,春花似錦彪标、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至萌业,卻和暖如春坷襟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背生年。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工婴程, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人抱婉。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓档叔,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親蒸绩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子衙四,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

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