MongoDB + Mongoose與Node.js結(jié)合使用的后端開(kāi)發(fā)的最佳實(shí)踐

文末福利資源更新
1.為什么需要Mongoose?
你有一個(gè)數(shù)據(jù)庫(kù)服務(wù)器(例如MongoDB社區(qū)服務(wù)器) 你正在運(yùn)行一個(gè)Node.js腳本(作為一個(gè)進(jìn)程)
2.如何連接Mongoose + MongoDB
mongoose.connect(DB_CONNECTION_STRING, {
useNewUrlParser: true,
useUnifiedTopology: true,
useCreateIndex: true,
useFindAndModify: false
})
3.如何執(zhí)行Mongoose操作
現(xiàn)在我們先來(lái)快速討論一下Mongoose的操作,以及你應(yīng)該如何執(zhí)行這些操作。
Mongoose為您提供以下兩種選擇:
基于游標(biāo)的(Cursor-based)查詢(xún) 全程檢索(Full fetching)查詢(xún)
3.1 基于游標(biāo)的(Cursor-based)查詢(xún)
3.2 全程檢索(Full fetching)查詢(xún)
4.如何使用Mongoose模型(Models)
import mongoose from 'mongoose'
const CompletedSchema = new mongoose.Schema(
{
type: { type: String, enum: ['course', 'classroom'], required: true },
parentslug: { type: String, required: true },
slug: { type: String, required: true },
userid: { type: String, required: true }
},
{ collection: 'completed' }
)
CompletedSchema.index({ slug: 1, userid: 1 }, { unique: true })
const model = mongoose.model('Completed', CompletedSchema)
export default model
在所有需要的字段中,盡量保持 required: true。如果你在創(chuàng)建對(duì)象時(shí)沒(méi)有使用TypeScript這樣的靜態(tài)類(lèi)型檢查系統(tǒng)來(lái)協(xié)助你正確地檢查屬性名,那么這可以為你省去很多麻煩。另外,免費(fèi)的驗(yàn)證也超級(jí)酷。定義索引和唯一字段。 unique屬性也可以在模式中添加。索引是一個(gè)很廣泛的話(huà)題,所以我在這里就不深究了。但從大范圍來(lái)看,它們確實(shí)可以幫助你加快很多查詢(xún)速度。明確定義一個(gè)集合名。雖然Mongoose可以根據(jù)模型的名稱(chēng)自動(dòng)給出一個(gè)集合名稱(chēng)(例如這里的 Completedhere),但在我看來(lái)這太抽象了。你至少應(yīng)該知道你的數(shù)據(jù)庫(kù)名稱(chēng)和代碼庫(kù)中的集合。如果可以,請(qǐng)使用枚舉來(lái)限制值。
5.如何執(zhí)行CRUD操作
5.1 Create
try {
const res = await CompletedSchema.create(record)
} catch(error) {
console.error(error)
// handle the error
}
使用async-await而不是回調(diào)(看起來(lái)不錯(cuò),但沒(méi)有突破性的性能優(yōu)勢(shì)) 在查詢(xún)周?chē)褂胻ry-catch塊,因?yàn)槟愕牟樵?xún)可能會(huì)因?yàn)橐恍┰蚨。ㄖ貜?fù)記錄、錯(cuò)誤的值等)。
5.2 Read
const res = await CompletedSchema.find(info).lean()
你能看到那里的
lean()函數(shù)調(diào)用嗎?它對(duì)性能超級(jí)有用。默認(rèn)情況下,Mongoose會(huì)處理從數(shù)據(jù)庫(kù)中返回的文檔,并在其上添加其神奇的方法(例如.save)。當(dāng)你使用
.lean()時(shí),Mongoose會(huì)返回普通的JSON對(duì)象,而不是內(nèi)存和資源沉重的文檔。使查詢(xún)速度更快,對(duì)CPU的消耗也更小。然而,如果你確實(shí)想要更新數(shù)據(jù),你可以省略
.lean()(我們接下來(lái)會(huì)看到)
5.3 Update
.lean() 觸發(fā)),你可以簡(jiǎn)單地去修改對(duì)象屬性,然后用 object.save() 保存它。const doc = await CompletedSchema.findOne(info)
doc.slug = 'something-else'
await doc.save()
findOne上,第二個(gè)是在 doc.save 上。const res = await CompletedSchema.updateOne(, ).lean()
并且只會(huì)對(duì)數(shù)據(jù)庫(kù)進(jìn)行一次調(diào)用。
5.4 Delete
使用Mongoose刪除也很簡(jiǎn)單,讓我們看看如何刪除單個(gè)文檔:
const res = await CompletedSchema.deleteOne(<condition>)
updateOne 一樣 deleteOne 也接受第一個(gè)參數(shù)作為文檔的匹配條件。deleteMany,只有當(dāng)你知道要?jiǎng)h除多個(gè)文檔時(shí)才使用。deleteOne 來(lái)避免意外的多次刪除,特別是當(dāng)你試圖自己執(zhí)行查詢(xún)時(shí)。原文:https://www.freecodecamp.org/news/mongodb-mongoose-node-tutorial/
作者:Mehul Mohan
粉絲福利
143期留言+在看幸運(yùn)用戶(hù):暫無(wú)。
臨走前留下,今天的福利
福利1:《用 React.js+Egg.js 造輪子 全棧開(kāi)發(fā)旅游電商應(yīng)用》獲取資源請(qǐng)?jiān)诠娞?hào)對(duì)話(huà)框中回復(fù)關(guān)鍵字:043,如果沒(méi)有關(guān)注請(qǐng)掃下面的二維碼 福利2:在看+留言,我隨機(jī)抽取一位認(rèn)真留言的小伙伴,給他發(fā)一個(gè)紅包獎(jiǎng)勵(lì)
最近文章
Fetch API速查表:9個(gè)最常見(jiàn)的API請(qǐng)求
什么是AVIF?如何在你的網(wǎng)站上使用AV1圖像格式
將HTML表格轉(zhuǎn)換成精美的PDF的幾種方案比較
思維訓(xùn)練:如何設(shè)計(jì)一個(gè)JavaScript插件系統(tǒng)?
-?END -
點(diǎn)贊 + 在看 + 留言,下一個(gè)幸運(yùn)兒就是你!
走心的分享更容易被抽中~
開(kāi)獎(jiǎng)時(shí)間?下期文末

