成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

mongoose再認(rèn)識(shí)(二)

Blackjun / 708人閱讀

摘要:文章接續(xù)再認(rèn)識(shí)一,下文中使用代碼可參考這篇文章中的。這也是它存在的意義。注在使用操作數(shù)據(jù)庫(kù)中的數(shù)據(jù)時(shí)一定要注意,要操作的時(shí)或返回的一整條數(shù)據(jù),如果是實(shí)例化了一個(gè),則會(huì)造成數(shù)據(jù)庫(kù)中的數(shù)據(jù)丟失。系列文章再認(rèn)識(shí)一再認(rèn)識(shí)二再認(rèn)識(shí)三

在開(kāi)發(fā)中,除了使用mongoose進(jìn)行一些基本的操作外,就是一些技巧的使用。

文章接續(xù)mongoose再認(rèn)識(shí)(一),下文中使用代碼可參考這篇文章中的。

虛擬字段

虛擬字段,從字面意思就可以明白,它不是真正的字段,不存在與數(shù)據(jù)庫(kù)中,但是當(dāng)使用model實(shí)例查詢時(shí),卻可以靈活的運(yùn)用這個(gè)字段。

注:這個(gè)特性是mongoose自己的,與mongo無(wú)關(guān)。

...
// 添加了一個(gè)虛擬的fullname字段
// get fullname
UserSchema
  .virtual("fullname")
  .get(() => this.firstname + " " + this.lastname)
// set fullname
UserSchema
  .virtual("fullname")
  .set((name) => let arr = name.split(" "), this.firstname = arr[0], this.lastname = arr[1] )

// read
UserModel
  .find({})
  .exec()
  .then(doc => {
    console.log(doc[0])
  })

查詢的結(jié)果如下:

{ _id: 5c1dc7248aaf9c2c80fee915,
  firstname: "東坡",
  lastname: "蘇",
  __v: 0 }

那么,如何獲取到結(jié)果fullname呢?

可以通過(guò)doc[0].fullname來(lái)獲取。

如何對(duì)數(shù)據(jù)進(jìn)行保存呢?代碼如下:

// 模擬AJAX請(qǐng)求保存數(shù)據(jù)
let person2 = new UserModel()
person2.fullname = "白 李"

person2
  .save()
  .then(doc => console.log(doc))
  .catch(err => console.log(err))

返回結(jié)果:

{ _id: 5c1dd7ef535df51980e9fd98,
  firstname: "白",
  lastname: "李",
  __v: 0 }

這樣,在開(kāi)發(fā)的過(guò)程中,就不用擔(dān)心因?yàn)樽侄尾黄ヅ涠枰薷臄?shù)據(jù)庫(kù)的問(wèn)題。這也是它存在的意義。

有興趣的同學(xué)可參考node club中對(duì)user.js中用戶的分級(jí),不需要在建立一個(gè)字段用來(lái)保存用戶的等級(jí),可以用virtual Type通過(guò)socre計(jì)算來(lái)得出來(lái)。

在Schema定義一些Model實(shí)例常用的方法

熟悉mongoose的原理的都知道,Model的構(gòu)造函數(shù)是在Schema實(shí)例的基礎(chǔ)上創(chuàng)造出來(lái)的。所以,對(duì)于頻繁操作的Model實(shí)例方法,可以在Schema的實(shí)例上進(jìn)行定義(具體的可參考JavaScript的prototype)。

在一個(gè)Schema中經(jīng)常會(huì)帶有updateAtcreateAt這樣的字段,通常的情況下,會(huì)給它們一個(gè)默認(rèn)的值。userSchema代碼修改如下:

let UserSchema = new mongoose.Schema({
  firstname: String,
  lastname: String,
  createAt: {
    type: Date,
    default: Date.now
  },
  updateAt: {
    type: Date,
    default: Date.now
  }
})

在開(kāi)發(fā)中,開(kāi)發(fā)者往往不會(huì)手動(dòng)的處理它們,但是對(duì)于跟蹤記錄一個(gè)數(shù)據(jù)來(lái)說(shuō)又很必要,也不允許用對(duì)這些數(shù)據(jù)任意的修改。那么,應(yīng)該如何操作它才是最好的呢?

當(dāng)然,最好就是在執(zhí)行post請(qǐng)求的時(shí)候,會(huì)有一些方法會(huì)根據(jù)一定機(jī)制自動(dòng)保存。

而mongoose就存在這樣的機(jī)制,可以在Schema的實(shí)例上添加pre的方法,代碼如下:

UserSchema.pre("save", function(next) {
  let now = Date.now()
  this.updateAt = now;

  if (!this.createAt) this.createAt = now;
  next()
})

模擬AJAX請(qǐng)求保存數(shù)據(jù):

let person3 = new UserModel()
person3.fullname = "甫 杜"

person3
  .save()
  .then(doc => console.log(doc))
  .catch(err => console.log(err))

返回結(jié)果:

{ _id: 5c1e006204bad42224374aea,
  createAt: 2018-12-22T09:14:10.862Z,
  updateAt: 2018-12-22T09:14:10.877Z,
  firstname: "甫",
  lastname: "杜",
  __v: 0 }

這個(gè)覺(jué)過(guò)并不能說(shuō)明問(wèn)題,它是Schema定義時(shí)和pre方法共同作用的結(jié)果。

嘗試更新數(shù)據(jù)來(lái)驗(yàn)證定義的方法,代碼如下:

UserModel.findOne({
  lastname: "杜"
})
.exec()
.then(function(doc) {
  doc.lastname = "杜"
  doc.firstname = "甫"

  doc.save()
  .then(doc => {
    console.log(doc)
  })
  .catch(err => {
    console.error(err)
  })
})
.catch(err => console.log(err))

返回結(jié)果:

{ _id: 5c1e006204bad42224374aea,
  createAt: 2018-12-22T09:14:10.862Z,
  updateAt: 2018-12-22T09:15:04.398Z,
  firstname: "牧",
  lastname: "杜",
  __v: 0 }

這里,我們使用save對(duì)數(shù)據(jù)進(jìn)行更新,當(dāng)然這對(duì)于跟蹤用戶的操作行為很有好處,但是并不是所有的數(shù)據(jù)都需要的,而對(duì)于哪些不需要的,還是可以考慮使用findOneAndUpdate,updae,updateMany的。

細(xì)心的同學(xué)會(huì)發(fā)現(xiàn),其實(shí)它和shell命令的db.users.insert({})類似,user.save({})是插入一條數(shù)據(jù),而后者則可以插入多條數(shù)據(jù)。

注:在使用操作數(shù)據(jù)庫(kù)中的數(shù)據(jù)時(shí)一定要注意,要操作的時(shí)user.find()user.findOne()返回的一整條數(shù)據(jù),如果是實(shí)例化了一個(gè)UserModel,則會(huì)造成數(shù)據(jù)庫(kù)中的數(shù)據(jù)丟失。

mongoose系列文章

mongoose 再認(rèn)識(shí)(一)

mongoose 再認(rèn)識(shí)(二)

mongoose 再認(rèn)識(shí)(三)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/19445.html

相關(guān)文章

  • mongoose基本認(rèn)識(shí)

    摘要:安裝然后,我們需要將引入我們的項(xiàng)目中,使用連接我們?cè)诒镜剡\(yùn)行實(shí)例名為數(shù)據(jù)庫(kù)。在連接到本地的數(shù)據(jù)庫(kù),我們需要知道連接的是否成功在中,全部來(lái)源于那么,到目前為止,我們創(chuàng)建了一個(gè)只有一個(gè)屬性值為類型的的。 起步 首先先確定MongoDB和Node.js已經(jīng)安裝。安裝Mongoose: npm install mongoose 然后,我們需要將mongoose引入我們的項(xiàng)目中,使用mongoo...

    hatlonely 評(píng)論0 收藏0
  • 【實(shí)戰(zhàn)】用 express+MongoDB 搭建一個(gè)完整的前端項(xiàng)目

    摘要:前言要做一個(gè)全沾的工程師,對(duì)于后端和數(shù)據(jù)庫(kù)來(lái)說(shuō),即使不認(rèn)識(shí)也要見(jiàn)個(gè)面的?;玖私獾母拍罹秃?,主要是安裝上數(shù)據(jù)庫(kù),并進(jìn)行簡(jiǎn)單的增刪操作。 前言:要做一個(gè)全沾的工程師,對(duì)于后端和數(shù)據(jù)庫(kù)來(lái)說(shuō),即使不認(rèn)識(shí)也要見(jiàn)個(gè)面的。本文給的例子很簡(jiǎn)單,也貼出來(lái)源碼,只要一步步下來(lái),就可以跑起來(lái)啦~~~ 思考一個(gè)需求:做一個(gè)登錄頁(yè)面,自己搭建服務(wù)和數(shù)據(jù)庫(kù),將用戶輸入的登錄信息保存到數(shù)據(jù)庫(kù)如何完成呢:首先選擇...

    Steve_Wang_ 評(píng)論0 收藏0
  • 「全棧初探」- Mongoose的簡(jiǎn)單使用

    摘要:下載依賴包完成項(xiàng)目創(chuàng)建,項(xiàng)目結(jié)構(gòu)連接數(shù)據(jù)庫(kù)在根目錄下創(chuàng)建,輸入以下代碼,監(jiān)聽(tīng)的幾個(gè)事件,如果以上操作都沒(méi)錯(cuò)的話,那么就會(huì)監(jiān)聽(tīng)第一個(gè)事件事件,表示連接數(shù)據(jù)庫(kù)成功,在最后,我們導(dǎo)出對(duì)象,以供其他模塊使用。 一、準(zhǔn)備工作 1. 啟動(dòng)mongo數(shù)據(jù)庫(kù) 關(guān)于下載安裝啟動(dòng)數(shù)據(jù)庫(kù)我這里就不做過(guò)多解釋,谷歌下會(huì)有很多教程,啟動(dòng)成功后的命令窗如下所示: showImg(https://segmentfa...

    vboy1010 評(píng)論0 收藏0
  • react下express+mongodb入門(mén)使用

    摘要:個(gè)人用的是腳手架創(chuàng)建的用于開(kāi)發(fā)接口注意使用腳手架時(shí),會(huì)自帶,如果再次執(zhí)行安裝了,運(yùn)行會(huì)報(bào)錯(cuò),此時(shí)需要卸載,然后重新安裝就了。 個(gè)人用的是create-react-app腳手架創(chuàng)建的APP Express:用于開(kāi)發(fā)web接口 ?。。∽⒁?: 使用腳手架時(shí),node_modules 會(huì)自帶express,如果再次執(zhí)行 npm install express --save 安裝了 expr...

    JohnLui 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<