<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 4196字,需瀏覽 9分鐘

           ·

          2020-12-15 01:13


          文末福利資源更新
          MongoDB無(wú)疑是當(dāng)今最受歡迎的NoSQL數(shù)據(jù)庫(kù)選擇之一,它有一個(gè)很棒的社區(qū)和生態(tài)系統(tǒng)。
          在本文中,我們將介紹在使用Node.js設(shè)置MongoDB和Mongoose時(shí)應(yīng)遵循的一些最佳實(shí)踐。

          1.為什么需要Mongoose?

          為了理解我們?yōu)槭裁葱枰狹ongoose,我們先來(lái)了解MongoDB(也是一個(gè)數(shù)據(jù)庫(kù))在架構(gòu)層面的工作原理。
          • 你有一個(gè)數(shù)據(jù)庫(kù)服務(wù)器(例如MongoDB社區(qū)服務(wù)器)
          • 你正在運(yùn)行一個(gè)Node.js腳本(作為一個(gè)進(jìn)程)
          MongoDB服務(wù)器在TCP套接字上監(jiān)聽(tīng)(通常),你的Node.js進(jìn)程可以使用TCP連接來(lái)連接它。
          但是在TCP之上,MongoDB也有自己的協(xié)議來(lái)了解客戶(hù)端(我們的Node.js進(jìn)程)到底想要數(shù)據(jù)庫(kù)做什么。
          對(duì)于這種通信,我們不需要學(xué)習(xí)我們?cè)赥CP層上要發(fā)送的消息,而是借助一個(gè)“驅(qū)動(dòng)”軟件將其抽象掉,在這里稱(chēng)為MongoDB驅(qū)動(dòng)。MongoDB驅(qū)動(dòng)在這里以npm包的形式提供。
          現(xiàn)在請(qǐng)記住,MongoDB 驅(qū)動(dòng)程序負(fù)責(zé)連接和抽象你的低層通信請(qǐng)求/響應(yīng)——但作為開(kāi)發(fā)者,這只能讓你走到這一步。
          因?yàn)镸ongoDB是一個(gè)無(wú)模式數(shù)據(jù)庫(kù),它為你提供了比初學(xué)者所需的更多的功能。更大的權(quán)利意味著更大的出錯(cuò)可能性,你需要減少可在代碼中制作的錯(cuò)誤和破壞表的可能性。
          Mongoose是對(duì)原生MongoDB驅(qū)動(dòng)(我上面提到的npm包)的一個(gè)抽象。
          抽象化的一般經(jīng)驗(yàn)法則(我理解的方式)是,每一個(gè)抽象化都會(huì)損失一些底層操作能力。但這并不一定意味著它是壞的,有時(shí)它能提高生產(chǎn)力1000倍以上,因?yàn)槟愀静恍枰耆L(fǎng)問(wèn)底層API。
          一個(gè)好的思路是,你在技術(shù)上用C語(yǔ)言和Python創(chuàng)建一個(gè)實(shí)時(shí)聊天應(yīng)用。作為開(kāi)發(fā)人員,Python的例子將更容易和更快地實(shí)現(xiàn),生產(chǎn)率更高。C可能更有效率,但它會(huì)在生產(chǎn)力、開(kāi)發(fā)速度、錯(cuò)誤、崩潰方面付出巨大的代價(jià)。另外,在大多數(shù)情況下,你不需要擁有C給你的能力來(lái)實(shí)現(xiàn)websockets。
          同樣,使用Mongoose,你可以限制你的底層API訪(fǎng)問(wèn)的范圍,但可以釋放出很多潛在的收益和良好的DX。

          2.如何連接Mongoose + MongoDB

          首先,讓我們快速看看在2020年應(yīng)該如何用Mongoose連接到你的MongoDB數(shù)據(jù)庫(kù)。
          mongoose.connect(DB_CONNECTION_STRING, {
          useNewUrlParser: true,
          useUnifiedTopology: true,
          useCreateIndex: true,
          useFindAndModify: false
          })
          這種連接格式確保你正在使用Mongoose的新URL解析器,而且你沒(méi)有使用任何廢棄的做法。

          3.如何執(zhí)行Mongoose操作

          現(xiàn)在我們先來(lái)快速討論一下Mongoose的操作,以及你應(yīng)該如何執(zhí)行這些操作。

          Mongoose為您提供以下兩種選擇:

          1. 基于游標(biāo)的(Cursor-based)查詢(xún)
          2. 全程檢索(Full fetching)查詢(xún)

          3.1 基于游標(biāo)的(Cursor-based)查詢(xún)

          基于游標(biāo)的查詢(xún)是指一次只處理一條記錄,同時(shí)一次從數(shù)據(jù)庫(kù)中獲取一條或一批文檔。這是一種在有限的內(nèi)存環(huán)境下處理海量數(shù)據(jù)的有效方式。
          想象一下,你要在1GB/1核云服務(wù)器上解析總大小為10GB的文檔。你不能獲取整個(gè)集合,因?yàn)槟窃谀愕南到y(tǒng)中不合適。游標(biāo)是一個(gè)很好的(也是唯一的)選擇。

          3.2 全程檢索(Full fetching)查詢(xún)

          這是一種查詢(xún)類(lèi)型,你可以一次性獲得查詢(xún)的全部響應(yīng)。在大多數(shù)情況下,這就是你要使用的方法。因此,我們將在這里主要關(guān)注這個(gè)方法。

          4.如何使用Mongoose模型(Models)

          模型是Mongoose的超級(jí)力量,它們幫助你執(zhí)行“schema”規(guī)則,并為你的Node代碼提供無(wú)縫集成到數(shù)據(jù)庫(kù)調(diào)用中。
          第一步是定義一個(gè)好的模型:
          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
          這是一個(gè)直接從codedamn的代碼庫(kù)中刪減的例子。這里有一些有趣的事情你應(yīng)該注意。
          1. 在所有需要的字段中,盡量保持 required: true 。如果你在創(chuàng)建對(duì)象時(shí)沒(méi)有使用TypeScript這樣的靜態(tài)類(lèi)型檢查系統(tǒng)來(lái)協(xié)助你正確地檢查屬性名,那么這可以為你省去很多麻煩。另外,免費(fèi)的驗(yàn)證也超級(jí)酷。
          2. 定義索引和唯一字段。unique 屬性也可以在模式中添加。索引是一個(gè)很廣泛的話(huà)題,所以我在這里就不深究了。但從大范圍來(lái)看,它們確實(shí)可以幫助你加快很多查詢(xún)速度。
          3. 明確定義一個(gè)集合名。雖然Mongoose可以根據(jù)模型的名稱(chēng)自動(dòng)給出一個(gè)集合名稱(chēng)(例如這里的 Completed here),但在我看來(lái)這太抽象了。你至少應(yīng)該知道你的數(shù)據(jù)庫(kù)名稱(chēng)和代碼庫(kù)中的集合。
          4. 如果可以,請(qǐng)使用枚舉來(lái)限制值。

          5.如何執(zhí)行CRUD操作

          CRUD是指創(chuàng)建、讀取、更新和刪除。這是四個(gè)基本選項(xiàng),有了這四個(gè)選項(xiàng),你就可以在數(shù)據(jù)庫(kù)中進(jìn)行任何形式的數(shù)據(jù)操作。讓我們快速看看這些操作的一些例子。

          5.1 Create

          這簡(jiǎn)單來(lái)說(shuō)就是在數(shù)據(jù)庫(kù)中創(chuàng)建一條新記錄。讓我們使用我們上面定義的模型來(lái)創(chuàng)建一條記錄。
          try {
          const res = await CompletedSchema.create(record)
          } catch(error) {
          console.error(error)
          // handle the error
          }
          同樣,這里有一些提示:
          1. 使用async-await而不是回調(diào)(看起來(lái)不錯(cuò),但沒(méi)有突破性的性能優(yōu)勢(shì))
          2. 在查詢(xún)周?chē)褂胻ry-catch塊,因?yàn)槟愕牟樵?xún)可能會(huì)因?yàn)橐恍┰蚨。ㄖ貜?fù)記錄、錯(cuò)誤的值等)。

          5.2 Read

          這意味著從數(shù)據(jù)庫(kù)中讀取現(xiàn)有的值。這聽(tīng)起來(lái)很簡(jiǎn)單,但你應(yīng)該知道Mongoose的幾個(gè)小問(wèn)題。
          const res = await CompletedSchema.find(info).lean()
          1. 你能看到那里的 lean() 函數(shù)調(diào)用嗎?它對(duì)性能超級(jí)有用。默認(rèn)情況下,Mongoose會(huì)處理從數(shù)據(jù)庫(kù)中返回的文檔,并在其上添加其神奇的方法(例如 .save)。

          2. 當(dāng)你使用 .lean() 時(shí),Mongoose會(huì)返回普通的JSON對(duì)象,而不是內(nèi)存和資源沉重的文檔。使查詢(xún)速度更快,對(duì)CPU的消耗也更小。

          3. 然而,如果你確實(shí)想要更新數(shù)據(jù),你可以省略 .lean() (我們接下來(lái)會(huì)看到)

          5.3 Update

          如果你已經(jīng)有了一個(gè)Mongoose文檔(沒(méi)有使用 .lean() 觸發(fā)),你可以簡(jiǎn)單地去修改對(duì)象屬性,然后用 object.save() 保存它。
          const doc = await CompletedSchema.findOne(info)
          doc.slug = 'something-else'
          await doc.save()
          記住,這里有兩個(gè)數(shù)據(jù)庫(kù)調(diào)用。第一個(gè)是在 findOne上,第二個(gè)是在 doc.save 上。
          如果可以,你應(yīng)該總是減少訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)的請(qǐng)求數(shù)量(因?yàn)槿绻容^內(nèi)存、網(wǎng)絡(luò)和磁盤(pán),網(wǎng)絡(luò)幾乎總是最慢的)。
          在另一種情況下,可以使用如下查詢(xún):
          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ù)作為文檔的匹配條件。
          還有另一個(gè)方法叫 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ì)

          最近文章

          -?END -

          點(diǎn)贊 + 在看 + 留言,下一個(gè)幸運(yùn)兒就是你!
          走心的分享更容易被抽中~

          開(kāi)獎(jiǎng)時(shí)間?下期文末

          瀏覽 30
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  嘻哈范大神dududown空姐 | 插入白丝袜舞蹈生妹妹的嫩穴网站 | 无码免费高清 | 18禁黄无码 | 一区无码一区二区三区 |