NODE.JS初學筆記12:利用MONGOOSE操作MONGODB(2):query與基本CURD操作

前言

上一篇文章我們介紹了如何利用mongoose操作mongodb資料庫並做了資料的建立,今天我們要接續上一篇文章的程式碼,來介紹一下要如何利用 mongoose執行資料的其餘CURD操作(create,update,read and delete)。

前置動作:打掉現有的collection並建立新的Schema

為了做之後的query,我想重新設計kittens這個collection,這時候你可以有兩種做法

  • 利用Kitten.collection.drop() 把整個collection拔掉再重新建立一個
  • 修改我們上次建立的 kittySchema

我這次會選擇方法一,原因在於修改 kittySchema 的話,上篇文章建立的Danny喵喵就還是會留在那邊而沒有我們新增的一些屬性。

先註解掉部分的程式碼,並在程式碼最後drop掉我們上次建立的collection

..skip
//建立model的實體(entity) 註解掉這行程式碼
// Kitten.create({ name: 'Danny' }).then(cat => console.log(`you create a cat name${cat.name}`))

//加入這行
Kitten.collection.drop() 

接著我們將我們 kittySchema 增加一項age屬性,執行前記得把剛剛的Kitten.collection.drop()註解掉!

//建立Schema
var kittySchema = mongoose.Schema({
  name: String,
  age:Number   //加入這行
}); 

利用faker加入假資料

接著我們需要建立一些實體方便我們等一下做操作,不過一個一個打實在太麻煩又無趣了。
這邊介紹一個npm套件-faker ,一個用來產生各種假資料的套件,可以點這邊看官方文件。
我們要隨機產生的是名稱與年齡,所以我會使用 faker.random & faker.name兩個method。

//用簡單的迴圈建立假資料
for (let i = 0; i < 10; i++) {
  let age = faker.random.number({ min: 0, max: 15 })
  let name = faker.name.firstName(0)
  Kitten.create({
    name,
    age
  })
} 

這邊注意一下我用了幾個官方文件上沒有的東西。

  • 我在faker.random.number中傳入了一個option,若你沒有傳入任何option 就會從0~99999隨機產生,就我所知貓是有點短命的~所以這邊做個簡單的上限。
  • faker.name.firstName傳入數字0去特別定義產生的名稱會是男性名字,若傳入1則會產生女性名稱。

一切順利的話,再次執行程式後並打開compass確認成果,你應該會看到類似以下的結果。

產生的部分假資料

Query資料庫中的資料

現在資料庫中已經有10筆資料了,那我們要怎麼利用mongoose找到我們想要的資料然後做後續的更新或刪除呢?這個步驟我們稱為query,也就是查詢想要的資料。

這邊我介紹幾個我比較常用且基本的使用方式

Model.find() 找出所有符合條件的資料
Model.findById()根據objectId去找到該筆資料
Model.findOne()找到第一筆符合條件的資料

每個query的方式都可以傳入條件去更精確的搜尋出你想要的資料,其中也可以包含多種運算子的比較,可以參照這個網頁去了解如何運用基本的operator。

舉個例子來說,今天我想知道所有年齡大於6歲的喵喵名字,我的程式碼就會像是這樣,特別注意一下find會回傳一個包含資料物件的陣列,所以可以利用forEach來處理收到的資料。

//尋找並印出年齡大於6歲的喵喵名字
Kitten.find({
  age: { $gt: 6 }
})
  .then(cats => {
    cats.forEach(cat => console.log(cat.name))
  }) 
執行結果

Update指定的資料

現在你了解如何query了,那後續的步驟就簡單多了,我們現在有個名叫Mose的喵喵,我想幫他改個名字,就可以query那筆資料後做更新,最後再存進資料庫即可!這邊我們會用到之前建立新資料時介紹過的.save方法

// 更改Mose喵喵的名字
Kitten.findOne({ name: 'Mose' })
  .then(cat => {
    cat.name = 'Moooooooooose'
    cat.save()
    console.log('the name has been changed');
  }) 

打開compass確認你的結果,可以發現Mose喵喵已經不見了,變成Mooooooooooose喵了

執行結果

刪除指定的資料

刪除資料方法就更加多元一些了,你可以選擇以下三種作法

  • 利用Model.deleteMany()或是Model.deleteOne()去做資料的刪除
  • 利用Model.findOneAndDelete()找到資料並直接刪除
  • 利用Model.findOne或是Model.findById找到資料後,用remove方法刪除

這邊會示範的會是第三種我比較喜歡的作法,我們把剛剛改名的喵喵資料刪掉吧!

// 刪掉Mose喵喵的資料
Kitten.findById('5d779a3fbaf453fe585b85f7')
  .then(cat => cat.remove()) 

此時你打開compass確認,剛剛改名的喵喵就這樣不見了!

結語

這篇文章中我們介紹了如何在資料庫塞入假資料/種子資料並執行CURD的操作,query當然還有著許多許多的應用,比方說你可以限制資料的數量、順序等,使用上其實跟SQL的邏輯相同!了解這些基本語法後就可以開始嘗試各種不同的query條件以及處理回傳的資料,下一篇文章會是node的第一個專案文章-短網址產生器,應該會分成許多part,會是相當費時的東西! 希望能盡快產出囉!

發表留言