iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 18
0
AI & Data

從入門到精通 MongoDB系列 第 18

Day18: 進階的 CRUD 操作(8) - $inc, $max, $min, $elemMatch

今天這篇進階的 CRUD 操作文章裡,我們會介紹幾個可以對 field 的 value 進行操作的運算子,包含 $inc$max$min$elemMatch


$inc

我們可以使用 $inc 來對特定 field 的 value 進行增減的修改。

例如我們想要將 Jack 的年齡 + 1:db.people.updateOne({name:"Jack"}, {$inc: {age: 1}})

我們也可以將 Jack 的年齡 - 2:db.people.updateOne({name:"Jack"}, {$inc: {age: -2}})


$max

我們可以使用 $max 這個運算子來做 value 的修改,其功用是把傳入的值和原值比較,兩者取最大值。

例如我們執行以下指令 db.people.updateOne({name:"Jack"}, {$max: {age: 20}})

  • 20 和原值 26 比較,最大值為 26,因此資料未更改

而如果執行以下指令:db.people.updateOne({name:"Jack"}, {$max: {age: 29}})

  • 29 和原值 26 比較,最大值為 29,因此年齡資料更改為 29

$min

$max 相似,我們可也以使用 $min 這個運算子來做 value 的修改,其功用是把傳入的值和原值比較,兩者取最小值。

例如我們執行以下指令:db.people.updateOne({name:"Jack"}, {$min: {age: 30}})

  • 30 和原值 29 比較,最小值為 29,因此資料未更改

也可以執行以下指令:db.people.updateOne({name:"Jack"}, {$min: {age: 28}})

  • 28 和原值 29 比較,最小值為 28,因此年齡資料更改為 28

$elemMatch

我們先來看一下 hobby 有 movie 的結果:db.people.find({"hobby.type":"Movie"})

我們如果想要查詢 hobby 有 movie 且 movie 的 rating 大於等於 3 的人,可能會想要使用以下指令來查詢:db.people.find({"hobby.type":"Movie", "hobby.rating":{$gte:3}})

但我們會發現回傳的結果和沒有使用 $gte 的查詢結果一樣,那是因為第 2 個 object 的 Cook 的 rating 為 4,也大於等於 3,所以符合過濾條件

但這樣不符合我們的查詢要求,我們想要查詢的是 hobby 為 Movie 而且 rating 3 以上,我們可以使用 $elemMatch 這個運算子來對更精確對應的查詢:db.people.find({hobby: {$elemMatch: {$and: [{type:"Movie"},{rating: {$gte: 3}}]}}})

如此只會回傳 Movie 的 rating 大於等於 3 的唯一結果。

而如果我們想要進一步更改 hobby 為 Movie 且 rating 3 以上的資料,將其 rating + 1,可以使用以下指令:db.people.updateMany({hobby: {$elemMatch: {$and: [{type:"Movie"},{rating: {$gte: 3}}]}}}, {$inc: {"hobby.$.rating":1}})

  • 其中一開始的 $elemMatch 取出了 "Movie" 這個 element
  • 要對這個取出的 element 進行改值,需使用 hobby.$.rating,其中 $ 代表的是前面 $elemMagch 取出的 element(Movie)

最後使用 find() 來檢視更改的結果:


今天介紹了可以對 field 的 value 進行操作的運算子,包含 $inc$max$min$elemMatch。下一篇是進階的 CRUD 操作的最後一篇,會介紹 upsert 以及關於資料刪除的一些補充內容。


上一篇
Day17: 進階的 CRUD 操作(7) - updateOne(), updateMany(), $set, $unset, $rename
下一篇
Day19: 進階的 CRUD 操作(9) - upsert 及刪除資料的補充內容
系列文
從入門到精通 MongoDB26

尚未有邦友留言

立即登入留言