上一篇文章中介紹了怎么用python連接MongoDB數據庫,現在寫一下python控制MongoDB進行增刪改查操作。
首先連接數據庫:
import pymongo # 連接數據庫 myclient = pymongo.MongoClient("mongodb://localhost:27017/") mydb = myclient["mydb"] mycol = mydb["col"]
Python MongoDB增加數據
插入一條記錄:
x=mycol.insert_one({"name":"劉飛","age":19}) print(x)
輸出結果:
<pymongo.results.InsertOneResult object at 0x02A45620>
insert_one() 方法返回 InsertOneResult 對象,可使用下面方法查看對象所有的屬性:
x=mycol.insert_one({"name":"劉飛","age":19}) print(dir(x))
#輸出結果 ['_InsertOneResult__acknowledged', '_InsertOneResult__inserted_id', '_WriteResult__acknowledged', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__slots__', '__str__', '__subclasshook__', '_raise_if_unacknowledged', 'acknowledged', 'inserted_id']
該對象包含 inserted_id 屬性,它是插入文檔的 id 值。如果我們在插入文檔時沒有指定 _id,MongoDB 會為每個文檔添加一個唯一的 id。
x=mycol.insert_one({"name":"劉飛","age":19}) print(x.inserted_id)
#輸出結果 5d43d8189f5e382760e25acf
插入多個文檔:
集合中插入多個文檔使用 insert_many() 方法,該方法的第一參數是字典列表。
mylist = [ { "name": "Taobao", "alexa": "100", "url": "https://www.taobao.com" }, { "name": "QQ", "alexa": "101", "url": "https://www.qq.com" }, { "name": "Facebook", "alexa": "10", "url": "https://www.facebook.com" }, { "name": "知乎", "alexa": "103", "url": "https://www.zhihu.com" }, { "name": "Github", "alexa": "109", "url": "https://www.github.com" } ] x = mycol.insert_many(mylist) # 輸出插入的所有文檔對應的 _id 值 print(x.inserted_ids) #輸出結果 [ObjectId('5d43d9069f5e38272c69fc07'), ObjectId('5d43d9069f5e38272c69fc08'), ObjectId('5d43d9069f5e38272c69fc09'), ObjectId('5d43d9069f5e38272c69fc0a'), ObjectId('5d43d9069f5e38272c69fc0b')]
insert_many() 方法返回 InsertManyResult 對象,該對象包含 inserted_ids 屬性,該屬性保存着所有插入文檔的 id 值。
執行完以上查找,我們可以在命令終端,查看數據是否已插入:
插入指定id的多個文檔:
#先刪除之前插入的所有文檔 x=mycol.delete_many({}) print(x.deleted_count, "個文檔已刪除")
#輸出結果 11 個文檔已刪除
mylist = [ {"_id": 1, "name": "RUNOOB", "cn_name": "菜鳥教程"}, {"_id": 2, "name": "Google", "address": "Google 搜索"}, {"_id": 3, "name": "Facebook", "address": "臉書"}, {"_id": 4, "name": "Taobao", "address": "淘寶"}, {"_id": 5, "name": "Zhihu", "address": "知乎"} ] x = mycol.insert_many(mylist) # 輸出插入的所有文檔對應的 _id 值 print(x.inserted_ids) #輸出結果 [1, 2, 3, 4, 5]
執行完以上查找,我們可以在命令終端,查看數據是否已插入:
Python MongoDB 刪除數據
刪除單個文檔:
我們可以使用 delete_one() 方法來刪除一個文檔,該方法第一個參數為查詢對象,指定要刪除哪些數據。
本文使用的測試數據如下:
x=mycol.delete_one({"name":"Google"}) print(x.deleted_count,'個文檔已刪除') #輸出結果 1 個文檔已刪除
刪除多個文檔:
我們可以使用 delete_many() 方法來刪除多個文檔,該方法第一個參數為查詢對象,指定要刪除哪些數據。
刪除所有 name 字段中以 F 開頭的文檔:
myquery = {"name": {"$regex": "^F"}} x = mycol.delete_many(myquery) print(x.deleted_count, "個文檔已刪除") #輸出結果 2 個文檔已刪除
刪除集合中所有的文檔:
x = mycol.delete_many({}) print(x.deleted_count, "個文檔已刪除") #輸出結果 7 個文檔已刪除
刪除集合:
mycol.drop()
如果刪除成功 drop() 返回 true,如果刪除失敗(集合不存在)則返回 false。
我們使用以下命令在終端查看集合是否已刪除:
Python MongoDB 修改文檔
修改一條記錄
在 MongoDB 中使用 update_one() 方法修改文檔中的記錄。該方法第一個參數為查詢的條件,第二個參數為要修改的字段。如果查找到的匹配數據多余一條,則只會修改第一條。
本文使用的測試數據如下
將 alexa 字段的值 10000 改為 12345:
mycol.update_one({"alexa":'100'},{'$set':{"alexa":"123456"}}) for i in mycol.find(): print(i) #輸出結果 {'_id': ObjectId('5d43e5ff9f5e381df4a69bcd'), 'name': 'Taobao', 'alexa': '123456', 'url': 'https://www.taobao.com'} {'_id': ObjectId('5d43e5ff9f5e381df4a69bce'), 'name': 'QQ', 'alexa': '101', 'url': 'https://www.qq.com'} {'_id': ObjectId('5d43e5ff9f5e381df4a69bcf'), 'name': 'Facebook', 'alexa': '10', 'url': 'https://www.facebook.com'} {'_id': ObjectId('5d43e5ff9f5e381df4a69bd0'), 'name': '知乎', 'alexa': '103', 'url': 'https://www.zhihu.com'} {'_id': ObjectId('5d43e5ff9f5e381df4a69bd1'), 'name': 'Github', 'alexa': '109', 'url': 'https://www.github.com'}
修改多條記錄
使用 update_many()。查找所有以 F 開頭的 name 字段,並將匹配到所有記錄的 alexa 字段修改為 123:
x=mycol.update_many({"name":{"$regex":"^F"}},{"$set":{"alexa":"123"}}) print(x.modified_count,'個文檔已修改') #輸出結果 1 個文檔已修改
Python MongoDB 查詢文檔
MongoDB 中使用了 find 和 find_one 方法來查詢集合中的數據,它類似於 SQL 中的 SELECT 語句。
本文使用的測試數據如下
使用 find_one() 方法來查詢集合中的一條數據。
x = mycol.find_one() print(x) #輸出結果 {'_id': ObjectId('5d43e5ff9f5e381df4a69bcd'), 'name': 'Taobao', 'alexa': '123456', 'url': 'https://www.taobao.com'}
find() 方法可以查詢集合中的所有數據,類似 SQL 中的 SELECT * 操作。
for i in mycol.find(): print(i) #輸出結果 {'_id': ObjectId('5d43e5ff9f5e381df4a69bcd'), 'name': 'Taobao', 'alexa': '123456', 'url': 'https://www.taobao.com'} {'_id': ObjectId('5d43e5ff9f5e381df4a69bce'), 'name': 'QQ', 'alexa': '101', 'url': 'https://www.qq.com'} {'_id': ObjectId('5d43e5ff9f5e381df4a69bcf'), 'name': 'Facebook', 'alexa': '123', 'url': 'https://www.facebook.com'} {'_id': ObjectId('5d43e5ff9f5e381df4a69bd0'), 'name': '知乎', 'alexa': '103', 'url': 'https://www.zhihu.com'} {'_id': ObjectId('5d43e5ff9f5e381df4a69bd1'), 'name': 'Github', 'alexa': '109', 'url': 'https://www.github.com'}
查詢指定字段的數據
我們可以使用 find() 方法來查詢指定字段的數據,將要返回的字段對應值設置為 1。
for i in mycol.find({},{"_id":0,"name":1,"url":1}): print(i) #輸出結果 {'name': 'Taobao', 'url': 'https://www.taobao.com'} {'name': 'QQ', 'url': 'https://www.qq.com'} {'name': 'Facebook', 'url': 'https://www.facebook.com'} {'name': '知乎', 'url': 'https://www.zhihu.com'} {'name': 'Github', 'url': 'https://www.github.com'}
除了 _id 你不能在一個對象中同時指定 0 和 1,如果你設置了一個字段為 0,則其他都為 1,反之亦然。
以下實例除了 alexa 字段外,其他都返回:
for i in mycol.find({},{"alexa":0}): print(i) #輸出結果 {'_id': ObjectId('5d43e5ff9f5e381df4a69bcd'), 'name': 'Taobao', 'url': 'https://www.taobao.com'} {'_id': ObjectId('5d43e5ff9f5e381df4a69bce'), 'name': 'QQ', 'url': 'https://www.qq.com'} {'_id': ObjectId('5d43e5ff9f5e381df4a69bcf'), 'name': 'Facebook', 'url': 'https://www.facebook.com'} {'_id': ObjectId('5d43e5ff9f5e381df4a69bd0'), 'name': '知乎', 'url': 'https://www.zhihu.com'} {'_id': ObjectId('5d43e5ff9f5e381df4a69bd1'), 'name': 'Github', 'url': 'https://www.github.com'}
以下代碼同時指定了 0 和 1 則會報錯:
for i in mycol.find({},{"alexa":0,"name":1}): print(i) #報錯信息 pymongo.errors.OperationFailure: Projection cannot have a mix of inclusion and exclusion.
根據指定條件查詢
在 find() 中設置參數來過濾數據。查找 name 字段為 "QQ" 的數據:
mydoc = mycol.find({"name":"QQ"}) for i in mydoc: print(i) #輸出結果 {'_id': ObjectId('5d43e5ff9f5e381df4a69bce'), 'name': 'QQ', 'alexa': '101', 'url': 'https://www.qq.com'}
高級查詢
查詢的條件語句中,我們還可以使用修飾符。
讀取 name 字段中第一個字母 ASCII 值大於 "H" 的數據,大於的修飾符條件為 {"$gt": "H"} :
mydoc = mycol.find({"name":{"$gt":"H"}}) for i in mydoc: print(i) #輸出結果 {'_id': ObjectId('5d43e5ff9f5e381df4a69bcd'), 'name': 'Taobao', 'alexa': '123456', 'url': 'https://www.taobao.com'} {'_id': ObjectId('5d43e5ff9f5e381df4a69bce'), 'name': 'QQ', 'alexa': '101', 'url': 'https://www.qq.com'} {'_id': ObjectId('5d43e5ff9f5e381df4a69bd0'), 'name': '知乎', 'alexa': '103', 'url': 'https://www.zhihu.com'}
使用正則表達式查詢
正則表達式修飾符只用於搜索字符串的字段。
讀取 name 字段中第一個字母為 "T" 的數據,正則表達式修飾符條件為 {"$regex": "^T"} :
mydoc = mycol.find({"name":{"$regex":"^T"}}) for i in mydoc: print(i) #輸出結果 {'_id': ObjectId('5d43e5ff9f5e381df4a69bcd'), 'name': 'Taobao', 'alexa': '123456', 'url': 'https://www.taobao.com'}
返回指定條數記錄
如果我們要對查詢結果設置指定條數的記錄可以使用 limit() 方法,該方法只接受一個數字參數。
mydoc = mycol.find().limit(3) for i in mydoc: print(i) #輸出結果 {'_id': ObjectId('5d43e5ff9f5e381df4a69bcd'), 'name': 'Taobao', 'alexa': '123456', 'url': 'https://www.taobao.com'} {'_id': ObjectId('5d43e5ff9f5e381df4a69bce'), 'name': 'QQ', 'alexa': '101', 'url': 'https://www.qq.com'} {'_id': ObjectId('5d43e5ff9f5e381df4a69bcf'), 'name': 'Facebook', 'alexa': '123', 'url': 'https://www.facebook.com'}
排序
sort() 方法可以指定升序或降序排序。
sort() 方法第一個參數為要排序的字段,第二個字段指定排序規則,1 為升序,-1 為降序,默認為升序。
對字段 alexa 按升序排序:
mydoc = mycol.find().sort('alexa') for i in mydoc: print(i) #輸出結果 {'_id': ObjectId('5d43e5ff9f5e381df4a69bce'), 'name': 'QQ', 'alexa': '101', 'url': 'https://www.qq.com'} {'_id': ObjectId('5d43e5ff9f5e381df4a69bd0'), 'name': '知乎', 'alexa': '103', 'url': 'https://www.zhihu.com'} {'_id': ObjectId('5d43e5ff9f5e381df4a69bd1'), 'name': 'Github', 'alexa': '109', 'url': 'https://www.github.com'} {'_id': ObjectId('5d43e5ff9f5e381df4a69bcf'), 'name': 'Facebook', 'alexa': '123', 'url': 'https://www.facebook.com'} {'_id': ObjectId('5d43e5ff9f5e381df4a69bcd'), 'name': 'Taobao', 'alexa': '123456', 'url': 'https://www.taobao.com'}
對字段 alexa 按降序排序:
mydoc = mycol.find().sort('alexa',-1) for i in mydoc: print(i) #輸出結果 {'_id': ObjectId('5d43e5ff9f5e381df4a69bcd'), 'name': 'Taobao', 'alexa': '123456', 'url': 'https://www.taobao.com'} {'_id': ObjectId('5d43e5ff9f5e381df4a69bcf'), 'name': 'Facebook', 'alexa': '123', 'url': 'https://www.facebook.com'} {'_id': ObjectId('5d43e5ff9f5e381df4a69bd1'), 'name': 'Github', 'alexa': '109', 'url': 'https://www.github.com'} {'_id': ObjectId('5d43e5ff9f5e381df4a69bd0'), 'name': '知乎', 'alexa': '103', 'url': 'https://www.zhihu.com'} {'_id': ObjectId('5d43e5ff9f5e381df4a69bce'), 'name': 'QQ', 'alexa': '101', 'url': 'https://www.qq.com'}
done
參考資料:https://www.runoob.com/python3/python-mongodb.html