前言
上一篇文章我們介紹了如何利用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,會是相當費時的東西! 希望能盡快產出囉!