今天這篇進階的 CRUD 操作文章裡,我們會介紹幾個可以對 field 的 value 進行操作的運算子,包含
$inc
、$max
、$min
、$elemMatch
。
我們可以使用 $inc
來對特定 field 的 value 進行增減的修改。
例如我們想要將 Jack 的年齡 + 1:db.people.updateOne({name:"Jack"}, {$inc: {age: 1}})
我們也可以將 Jack 的年齡 - 2:db.people.updateOne({name:"Jack"}, {$inc: {age: -2}})
我們可以使用 $max
這個運算子來做 value 的修改,其功用是把傳入的值和原值比較,兩者取最大值。
例如我們執行以下指令 db.people.updateOne({name:"Jack"}, {$max: {age: 20}})
而如果執行以下指令:db.people.updateOne({name:"Jack"}, {$max: {age: 29}})
和 $max
相似,我們可也以使用 $min
這個運算子來做 value 的修改,其功用是把傳入的值和原值比較,兩者取最小值。
例如我們執行以下指令:db.people.updateOne({name:"Jack"}, {$min: {age: 30}})
也可以執行以下指令:db.people.updateOne({name:"Jack"}, {$min: {age: 28}})
我們先來看一下 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" 這個 elementhobby.$.rating
,其中 $
代表的是前面 $elemMagch
取出的 element(Movie)最後使用 find()
來檢視更改的結果:
今天介紹了可以對 field 的 value 進行操作的運算子,包含 $inc
、$max
、$min
、$elemMatch
。下一篇是進階的 CRUD 操作的最後一篇,會介紹 upsert
以及關於資料刪除的一些補充內容。