接續上一篇《mLab 雲端資料庫與 Python 之 CRUD - I. 新增/查詢篇》,接下來要介紹的是mLab雲端資料庫CRUD - C(create 新增)、R(read 讀取/查詢)、U(update 更新/修改)、D(delete 刪除)中的「修改」和「刪除」。
U (update 更新/修改)
Update 修改,也被稱為更新,是將資料庫裡已存在「資料表(collection)」中的「資料(document)」的內容(更精確的說法應該是「資料欄位(field)」)作更新/修改,要注意在mLab中 _id 這個資料欄位是主鍵(primarykey),是不可修改的。
PyMongo中提供了3種修改方法 update_one()、update_many()、replace_one()。update_one() 是修改一筆資料,update_many() 是修改多筆資料,replace_one() 是整筆替換。前面說過,update是修改已存在的資料,因此修改時要輸入條件(condition),才知道那些資料(符合條件者)要修改。
update方法有3個比較重要的參數:
update方法有3個比較重要的參數:
UpdateResult = update(filter, update,
upsert)
l
filter (必要):就是條件(condition),符合此條件的資料才會被修改。
l
update (必要):是要修改的動作,要把那個資料欄位的資料修改成什麼。
l
upsert (非必要):如果都沒有資料符合條件,是不是要新增一筆資料,預設為否(False)。這也是mLab資料庫特別之處,若是標準SQL語言,沒有這樣的處理方式,update若沒有符合的資料,就不會有動作,一定要存在的資料才能修改。
l
UpdateResult
修改結果,是修改執行後的回傳值,記錄了有幾筆符合條件的資料,有幾筆資料被修改。
先確定是否已有pymongo套件?因為pymongo不是Anaconda Distribution中預設安裝的套件,所以得開啟Anaconda Prompt安裝pymongo。使用命令 conda install pymongo,輸入y,同意安裝。
完成pymongo安裝,我們回到IPython中,因為pymongo已安裝在套件中,以後使用不需再import pymongo了。先建立資料庫連線,取得資料表。
# 建立 MongoDB 資料庫連線
from pymongo import MongoClient
myClient = MongoClient("Your_MongoDB_URI")
myDB = myClient.mlabtest01
myCollection = myDB.coll01
先看看coll01資料表中的資料,用find() 全部讀出來。
# 顯示所有資料
for myDocs in myCollection.find():
print(myDocs)
對照一下mLab中的資料表內容,當然都一致囉。
◇ 單筆修改 update_one()
先把資料apple的價格改為250,條件是Name = apple,修改動作是Price=250,這裡我們需用到 $set 運算子去修改資料,再全部讀出確認結果,程式如下:
# 把apple的價格改為250,並全部讀出
myResult = myCollection.update_one({"name":"apple"}, {"$set":{"price":250}})
for myDocs in myCollection.find():
print(myDocs)
真的修改成250了。upsert這個參數是非必要的,預設是否,所以若條件不符,就不會有任何動作。指定給myResult的原因為,update_one() 執行後會回傳 updateResult 修改結果,可以用如下程式來看修改結果。
myResult.matched_count # 有幾筆符合條件的資料
myResult.modified_count # 有幾筆資料被修改
# 找出價格是250的資料
for myDocs in myCollection.find({"price":250}):
print(myDocs)
接下來我們用update_one()把其中一筆的價格變成251,同時再列出全部確認資料修改,再查看matched_count和modified_count。
# 用update_one() 將價格由250改成251,再列出全部
myResult = myCollection.update_one({"price":250}, {"$set":{"price":251}})
for myDocs in myCollection.find():
print(myDocs)
myResult.matched_count # 有幾筆符合條件的資料
myResult.modified_count # 有幾筆資料被修改
◇ 多筆修改 update_many()
接下來試試多筆修改 update_many(),我們先列出價格大於200的資料。
# 查詢價格大於200的資料
for myDocs in myCollection.find({"price": {"$gt": 200}}):
print(myDocs)
# 用update_many()把這3筆資料的庫存stock都改成10
myResult = myCollection.update_many({"price":{"$gt": 200}}, {"$set":{"stock":10}})
for myDocs in myCollection.find():
print(myDocs)
myResult.matched_count # 有幾筆符合條件的資料
myResult.modified_count # 有幾筆資料被修改
◇ 整筆替換 replace_one()
replace_one()
是將符合條件的資料,除了 _id 欄位外,整筆完全以新資料替換。替換資料與新增功能相同可以增加、減少資料欄位,但不需有 _id 欄位,因為 _id 會不變。因此只有 replace_one() 功能,而沒有replace_many(),資料表裡沒道理有兩筆完全相同的資料。
# 以 replace_one() 整筆替換資料 apple
myResult = myCollection.replace_one({"name": "apple"},{"name": "Apple","unit": "box","price": 120,"stock": 20})
for myDocs in myCollection.find():
print(myDocs)
myResult.matched_count # 有幾筆符合條件的資料
myResult.modified_count # 有幾筆資料被修改
# Apple資料價格改為150,不放庫存資料
myResult = myCollection.replace_one({"name": "Apple"},{"name": "Apple","unit": "box","price": 150})
for myDocs in myCollection.find():
print(myDocs)
PyMongo的修改方法就介紹到這,想了解update方法更多細節,可以參考Update Data with PyMongo。
D (delete 刪除)
最後出場的是刪除,將資料表(collection)中的整筆資料(documents)刪除。PyMongo中提供了 delete_one() 和 delete_many() 兩種方法,和修改一樣是將符合條件(condition)的資料整筆刪除。delete刪除方法比較簡單:
DeleteResult = delete(filter)
l
filter
(必要):就是條件(condition),符合此條件的資料才會被刪除。
l
DeleteResult
刪除結果,是刪除執行後的回傳值,記錄了有幾筆資料被刪除。
◇ 單筆刪除 delete_one()
先刪除一筆資料,我們把 name=apple 這筆資料刪除,然後查看一下deleteResult,程式碼如下:
# 以 delete_one() 刪除 apple
myResult = myCollection.delete_one({"name": "apple"})
myResult.deleted_count # 有幾筆資料被刪除
# 以 delete_one() 刪除 Apple
myResult = myCollection.delete_one({"name": "Apple"})
myResult.deleted_count # 有幾筆資料被刪除
for myDocs in myCollection.find():
print(myDocs)
◇ 多筆刪除 delete_many()
再試試刪除多筆,價格大於200的資料有兩筆,我們將它們刪除。
# 以 delete_many() 刪除價格大於200的資料
myResult = myCollection.delete_many({"price":{"$gt": 200}})
for myDocs in myCollection.find():
print(myDocs)
myResult.deleted_count # 有幾筆資料被刪除
如果我們用單筆刪除 delete_one() 但條件有多筆符合呢?這時資料中價格大於50有兩筆,我們用delete_one() 試試看。
# 查詢價格大於 50 有幾筆?
for myDocs in myCollection.find({"price": {"$gt": 50}}):
print(myDocs)
# 刪除價格大於 50 的資料
myResult = myCollection.delete_one({"price": {"$gt": 50}})
myResult.deleted_count # 有幾筆資料被刪除
for myDocs in myCollection.find():
print(myDocs)
PyMongo的刪除方法及CRUD的介紹就到此結束了,您若想了解delete方法更多細節,可以參考Remove Data with PyMongo。
參考資料: