摘要:文章接續(xù)再認(rèn)識一,下文中使用代碼可參考這篇文章中的。這也是它存在的意義。注在使用操作數(shù)據(jù)庫中的數(shù)據(jù)時一定要注意,要操作的時或返回的一整條數(shù)據(jù),如果是實(shí)例化了一個,則會造成數(shù)據(jù)庫中的數(shù)據(jù)丟失。系列文章再認(rèn)識一再認(rèn)識二再認(rèn)識三
在開發(fā)中,除了使用mongoose進(jìn)行一些基本的操作外,就是一些技巧的使用。
文章接續(xù)mongoose再認(rèn)識(一),下文中使用代碼可參考這篇文章中的。
虛擬字段虛擬字段,從字面意思就可以明白,它不是真正的字段,不存在與數(shù)據(jù)庫中,但是當(dāng)使用model實(shí)例查詢時,卻可以靈活的運(yùn)用這個字段。
注:這個特性是mongoose自己的,與mongo無關(guān)。
... // 添加了一個虛擬的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呢?
可以通過doc[0].fullname來獲取。
如何對數(shù)據(jù)進(jìn)行保存呢?代碼如下:
// 模擬AJAX請求保存數(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 }
這樣,在開發(fā)的過程中,就不用擔(dān)心因?yàn)樽侄尾黄ヅ涠枰薷臄?shù)據(jù)庫的問題。這也是它存在的意義。
有興趣的同學(xué)可參考node club中對user.js中用戶的分級,不需要在建立一個字段用來保存用戶的等級,可以用virtual Type通過socre計(jì)算來得出來。
在Schema定義一些Model實(shí)例常用的方法熟悉mongoose的原理的都知道,Model的構(gòu)造函數(shù)是在Schema實(shí)例的基礎(chǔ)上創(chuàng)造出來的。所以,對于頻繁操作的Model實(shí)例方法,可以在Schema的實(shí)例上進(jìn)行定義(具體的可參考JavaScript的prototype)。
在一個Schema中經(jīng)常會帶有updateAt和createAt這樣的字段,通常的情況下,會給它們一個默認(rèn)的值。userSchema代碼修改如下:
let UserSchema = new mongoose.Schema({ firstname: String, lastname: String, createAt: { type: Date, default: Date.now }, updateAt: { type: Date, default: Date.now } })
在開發(fā)中,開發(fā)者往往不會手動的處理它們,但是對于跟蹤記錄一個數(shù)據(jù)來說又很必要,也不允許用對這些數(shù)據(jù)任意的修改。那么,應(yīng)該如何操作它才是最好的呢?
當(dāng)然,最好就是在執(zhí)行post請求的時候,會有一些方法會根據(jù)一定機(jī)制自動保存。
而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請求保存數(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 }
這個覺過并不能說明問題,它是Schema定義時和pre方法共同作用的結(jié)果。
嘗試更新數(shù)據(jù)來驗(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對數(shù)據(jù)進(jìn)行更新,當(dāng)然這對于跟蹤用戶的操作行為很有好處,但是并不是所有的數(shù)據(jù)都需要的,而對于哪些不需要的,還是可以考慮使用findOneAndUpdate,updae,updateMany的。
細(xì)心的同學(xué)會發(fā)現(xiàn),其實(shí)它和shell命令的db.users.insert({})類似,user.save({})是插入一條數(shù)據(jù),而后者則可以插入多條數(shù)據(jù)。
注:在使用操作數(shù)據(jù)庫中的數(shù)據(jù)時一定要注意,要操作的時user.find()或user.findOne()返回的一整條數(shù)據(jù),如果是實(shí)例化了一個UserModel,則會造成數(shù)據(jù)庫中的數(shù)據(jù)丟失。
mongoose系列文章mongoose 再認(rèn)識(一)
mongoose 再認(rèn)識(二)
mongoose 再認(rèn)識(三)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/19445.html
摘要:安裝然后,我們需要將引入我們的項(xiàng)目中,使用連接我們在本地運(yùn)行實(shí)例名為數(shù)據(jù)庫。在連接到本地的數(shù)據(jù)庫,我們需要知道連接的是否成功在中,全部來源于那么,到目前為止,我們創(chuàng)建了一個只有一個屬性值為類型的的。 起步 首先先確定MongoDB和Node.js已經(jīng)安裝。安裝Mongoose: npm install mongoose 然后,我們需要將mongoose引入我們的項(xiàng)目中,使用mongoo...
摘要:前言要做一個全沾的工程師,對于后端和數(shù)據(jù)庫來說,即使不認(rèn)識也要見個面的。基本了解的概念就好,主要是安裝上數(shù)據(jù)庫,并進(jìn)行簡單的增刪操作。 前言:要做一個全沾的工程師,對于后端和數(shù)據(jù)庫來說,即使不認(rèn)識也要見個面的。本文給的例子很簡單,也貼出來源碼,只要一步步下來,就可以跑起來啦~~~ 思考一個需求:做一個登錄頁面,自己搭建服務(wù)和數(shù)據(jù)庫,將用戶輸入的登錄信息保存到數(shù)據(jù)庫如何完成呢:首先選擇...
摘要:下載依賴包完成項(xiàng)目創(chuàng)建,項(xiàng)目結(jié)構(gòu)連接數(shù)據(jù)庫在根目錄下創(chuàng)建,輸入以下代碼,監(jiān)聽的幾個事件,如果以上操作都沒錯的話,那么就會監(jiān)聽第一個事件事件,表示連接數(shù)據(jù)庫成功,在最后,我們導(dǎo)出對象,以供其他模塊使用。 一、準(zhǔn)備工作 1. 啟動mongo數(shù)據(jù)庫 關(guān)于下載安裝啟動數(shù)據(jù)庫我這里就不做過多解釋,谷歌下會有很多教程,啟動成功后的命令窗如下所示: showImg(https://segmentfa...
摘要:個人用的是腳手架創(chuàng)建的用于開發(fā)接口注意使用腳手架時,會自帶,如果再次執(zhí)行安裝了,運(yùn)行會報(bào)錯,此時需要卸載,然后重新安裝就了。 個人用的是create-react-app腳手架創(chuàng)建的APP Express:用于開發(fā)web接口 ?。?!注意 : 使用腳手架時,node_modules 會自帶express,如果再次執(zhí)行 npm install express --save 安裝了 expr...
閱讀 2163·2021-11-24 09:39
閱讀 1654·2021-10-11 10:59
閱讀 2574·2021-09-24 10:28
閱讀 3458·2021-09-08 09:45
閱讀 1343·2021-09-07 10:06
閱讀 1747·2019-08-30 15:53
閱讀 2143·2019-08-30 15:53
閱讀 1476·2019-08-30 15:53