安裝
Python 要連接 MongoDB 需要 MongoDB 驅動。
pip安裝:
python3 -m pip3 install?pymongo
創建數據庫
import?pymongo
?
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["loaderman"]
注意: 在 MongoDB 中,數據庫只有在內容插入后才會創建! 就是說,數據庫創建后要創建集合(數據表)并插入一個文檔(記錄),數據庫才會真正創建。
判斷數據庫是否已存在:
import?pymongo
?
myclient = pymongo.MongoClient('mongodb://localhost:27017/')
?
dblist = myclient.list_database_names()
# dblist = myclient.database_names()
if?"loaderman"?in?dblist:
??print("數據庫已存在!")
注意:database_names 在最新版本的 Python 中已廢棄,Python3.7+ 之后的版本改為了 list_database_names()。
創建集合
import?pymongo
?
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["loaderman"]
?
mycol = mydb["t_user"]
import?pymongo
?
myclient = pymongo.MongoClient('mongodb://localhost:27017/')
?
mydb = myclient['loaderman']
?
collist = mydb. list_collection_names()
# collist = mydb.collection_names()
if?"t_user"?in?collist: # 判斷 sites 集合是否存在
??print("集合已存在!")
插入數據
用 insert_one() 方法,該方法的第一參數是字典 name => value 對。
插入單個數據:
import?pymongo
def?main():
????myclient = pymongo.MongoClient('mongodb://localhost:27017/')
????mydb = myclient["loaderman"]
????mycol = mydb["t_user"]
????mydict = {"name": "loaderman", "age": "18", "des": "碼上加油站,一起來加油"}
????x = mycol.insert_one(mydict)
????print(x.inserted_id)
if?__name__ == "__main__":
????main()
輸出:
5f05c019381b3ce588e04696
效果:
插入多條數據:
插入多個文檔使用 insert_many() 方法,該方法的第一參數是字典列表。
import?pymongo
def?main():
????myclient = pymongo.MongoClient('mongodb://localhost:27017/')
????mydb = myclient["loaderman"]
????mycol = mydb["t_site"]
????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)
if?__name__ == "__main__":
????main()
輸出:
[ObjectId('5f05c0c0bacd4ef964560988'), ObjectId('5f05c0c0bacd4ef964560989'), ObjectId('5f05c0c0bacd4ef96456098a'), ObjectId('5f05c0c0bacd4ef96456098b'), ObjectId('5f05c0c0bacd4ef96456098c')]
效果:
查詢數據
使用 find_one() 方法來查詢集合中的一條數據。
find() 方法可以查詢集合中的所有數據,類似 SQL 中的 SELECT * 操作。使用 find() 方法來查詢指定字段的數據,將要返回的字段對應值設置為 1。 可以對find() 中設置參數來過濾數據。
如果我們要對查詢結果設置指定條數的記錄可以使用 limit() 方法,該方法只接受一個數字參數。
import?pymongo
def?main():
????myclient = pymongo.MongoClient('mongodb://localhost:27017/')
????mydb = myclient["loaderman"]
????mycol = mydb["t_site"]
????# 使用 find_one() 方法來查詢集合中的一條數據。
????x = mycol.find_one()
????print("***********查詢集合中的一條數據。************")
????print(x)
????print("***********查詢集合中的所有數據************")
????# find() 方法可以查詢集合中的所有數據,類似 SQL 中的 SELECT * 操作。
????for?x in?mycol.find():
????????print(x)
????print("***********除了 alexa 字段外,其他都返回************")
????# find() 方法來查詢指定字段的數據,將要返回的字段對應值設置為 1。
????for?x in?mycol.find({}, {"alexa": 0}):
????????print(x)
????# 根據指定條件查詢,查找 name 字段為 "QQ" 的數據:
????myquery = {"name": "QQ"}
????mydoc = mycol.find(myquery)
????print("***********根據指定條件查詢************")
????for?x in?mydoc:
????????print(x)
????# 讀取 name 字段中第一個字母 ASCII 值大于 H" 的數據
????myquery2 = {"name": {"$gt": "H"}}
????mydoc2 = mycol.find(myquery2)
????print("***********讀取 name 字段中第一個字母ASCII值大于H的數據************")
????for?x in?mydoc2:
????????print(x)
????# 正則表達式查詢,讀取 name 字段中第一個字母為 "R" 的數據,正則表達式修飾符條件為 {"$regex": "^R"}
????myquery = {"name": {"$regex": "Q"}}
????print("***********正則表達式查詢************")
????mydoc = mycol.find(myquery)
????for?x in?mydoc:
????????print(x)
????print("***********返回指定條數記錄3條數據************")
????# 返回指定條數記錄,查詢結果設置指定條數的記錄可以使用 limit() 方法,該方法只接受一個數字參數。
????myresult = mycol.find().limit(3)
????# 輸出結果
????for?x in?myresult:
????????print(x)
if?__name__ == "__main__":
????main()
運行輸出:
***********查詢集合中的一條數據。************
{'_id': ObjectId('5f05c10bfd36a6335af1c492'), 'name': 'Taobao', 'alexa': '100', 'url': 'https://www.taobao.com'}
***********查詢集合中的所有數據************
{'_id': ObjectId('5f05c10bfd36a6335af1c492'), 'name': 'Taobao', 'alexa': '100', 'url': 'https://www.taobao.com'}
{'_id': ObjectId('5f05c10bfd36a6335af1c493'), 'name': 'QQ', 'alexa': '101', 'url': 'https://www.qq.com'}
{'_id': ObjectId('5f05c10bfd36a6335af1c494'), 'name': 'Facebook', 'alexa': '10', 'url': 'https://www.facebook.com'}
{'_id': ObjectId('5f05c10bfd36a6335af1c495'), 'name': '知乎', 'alexa': '103', 'url': 'https://www.zhihu.com'}
{'_id': ObjectId('5f05c10bfd36a6335af1c496'), 'name': 'Github', 'alexa': '109', 'url': 'https://www.github.com'}
***********除了 alexa 字段外,其他都返回************
{'_id': ObjectId('5f05c10bfd36a6335af1c492'), 'name': 'Taobao', 'url': 'https://www.taobao.com'}
{'_id': ObjectId('5f05c10bfd36a6335af1c493'), 'name': 'QQ', 'url': 'https://www.qq.com'}
{'_id': ObjectId('5f05c10bfd36a6335af1c494'), 'name': 'Facebook', 'url': 'https://www.facebook.com'}
{'_id': ObjectId('5f05c10bfd36a6335af1c495'), 'name': '知乎', 'url': 'https://www.zhihu.com'}
{'_id': ObjectId('5f05c10bfd36a6335af1c496'), 'name': 'Github', 'url': 'https://www.github.com'}
***********根據指定條件查詢************
{'_id': ObjectId('5f05c10bfd36a6335af1c493'), 'name': 'QQ', 'alexa': '101', 'url': 'https://www.qq.com'}
***********讀取 name 字段中第一個字母ASCII值大于H的數據************
{'_id': ObjectId('5f05c10bfd36a6335af1c492'), 'name': 'Taobao', 'alexa': '100', 'url': 'https://www.taobao.com'}
{'_id': ObjectId('5f05c10bfd36a6335af1c493'), 'name': 'QQ', 'alexa': '101', 'url': 'https://www.qq.com'}
{'_id': ObjectId('5f05c10bfd36a6335af1c495'), 'name': '知乎', 'alexa': '103', 'url': 'https://www.zhihu.com'}
***********正則表達式查詢************
{'_id': ObjectId('5f05c10bfd36a6335af1c493'), 'name': 'QQ', 'alexa': '101', 'url': 'https://www.qq.com'}
***********返回指定條數記錄3條數據************
{'_id': ObjectId('5f05c10bfd36a6335af1c492'), 'name': 'Taobao', 'alexa': '100', 'url': 'https://www.taobao.com'}
{'_id': ObjectId('5f05c10bfd36a6335af1c493'), 'name': 'QQ', 'alexa': '101', 'url': 'https://www.qq.com'}
{'_id': ObjectId('5f05c10bfd36a6335af1c494'), 'name': 'Facebook', 'alexa': '10', 'url': 'https://www.facebook.com'}
更新數據
import?pymongo
def?main():
????myclient = pymongo.MongoClient('mongodb://localhost:27017/')
????mydb = myclient["loaderman"]
????mycol = mydb["t_site"]
????myquery = {"alexa": "100"}
????newvalues = {"$set": {"alexa": "12345"}}
????#修匹配到的第一條記錄
????mycol.update_one(myquery, newvalues)
????# 輸出修改后的 "sites" 集合
????for?x in?mycol.find():
????????print(x)
????myquery = {"name": {"$regex": "^F"}}
????newvalues = {"$set": {"alexa": "66666"}}
????#修改所有匹配到的記錄
????x1 = mycol.update_many(myquery, newvalues)
????# 輸出修改后的 "sites" 集合
????for?x in?mycol.find():
????????print(x)
????print(x1.modified_count, "文檔已修改")
if?__name__ == "__main__":
????main()
輸出:
{'_id': ObjectId('5f05c10bfd36a6335af1c492'), 'name': 'Taobao', 'alexa': '12345', 'url': 'https://www.taobao.com'}
{'_id': ObjectId('5f05c10bfd36a6335af1c493'), 'name': 'QQ', 'alexa': '101', 'url': 'https://www.qq.com'}
{'_id': ObjectId('5f05c10bfd36a6335af1c494'), 'name': 'Facebook', 'alexa': '12356', 'url': 'https://www.facebook.com'}
{'_id': ObjectId('5f05c10bfd36a6335af1c495'), 'name': '知乎', 'alexa': '103', 'url': 'https://www.zhihu.com'}
{'_id': ObjectId('5f05c10bfd36a6335af1c496'), 'name': 'Github', 'alexa': '109', 'url': 'https://www.github.com'}
{'_id': ObjectId('5f05c10bfd36a6335af1c492'), 'name': 'Taobao', 'alexa': '12345', 'url': 'https://www.taobao.com'}
{'_id': ObjectId('5f05c10bfd36a6335af1c493'), 'name': 'QQ', 'alexa': '101', 'url': 'https://www.qq.com'}
{'_id': ObjectId('5f05c10bfd36a6335af1c494'), 'name': 'Facebook', 'alexa': '66666', 'url': 'https://www.facebook.com'}
{'_id': ObjectId('5f05c10bfd36a6335af1c495'), 'name': '知乎', 'alexa': '103', 'url': 'https://www.zhihu.com'}
{'_id': ObjectId('5f05c10bfd36a6335af1c496'), 'name': 'Github', 'alexa': '109', 'url': 'https://www.github.com'}
1?文檔已修改
排序
sort() 方法第一個參數為要排序的字段,第二個字段指定排序規則,1 為升序,-1 為降序,默認為升序。
import?pymongo
def?main():
????myclient = pymongo.MongoClient('mongodb://localhost:27017/')
????mydb = myclient["loaderman"]
????mycol = mydb["t_site"]
????mydoc = mycol.find().sort("alexa")
????for?x in?mydoc:
????????print(x)
if?__name__ == "__main__":
????main()
輸出:
{'_id': ObjectId('5f05c10bfd36a6335af1c493'), 'name': 'QQ', 'alexa': '101', 'url': 'https://www.qq.com'}
{'_id': ObjectId('5f05c10bfd36a6335af1c495'), 'name': '知乎', 'alexa': '103', 'url': 'https://www.zhihu.com'}
{'_id': ObjectId('5f05c10bfd36a6335af1c496'), 'name': 'Github', 'alexa': '109', 'url': 'https://www.github.com'}
{'_id': ObjectId('5f05c10bfd36a6335af1c492'), 'name': 'Taobao', 'alexa': '12345', 'url': 'https://www.taobao.com'}
{'_id': ObjectId('5f05c10bfd36a6335af1c494'), 'name': 'Facebook', 'alexa': '66666', 'url': 'https://www.facebook.com'}
刪除數據
用 delete_one() 方法來刪除一個文檔,該方法第一個參數為查詢對象,指定要刪除哪些數據。
使用 delete_many() 方法來刪除多個文檔,該方法第一個參數為查詢對象,指定要刪除哪些數據。
delete_many() 方法如果傳入的是一個空的查詢對象,則會刪除集合中的所有文檔。
使用 drop() 方法來刪除一個集合。
import?pymongo
def?main():
????myclient = pymongo.MongoClient('mongodb://localhost:27017/')
????mydb = myclient["loaderman"]
????mycol = mydb["t_site"]
????myquery = {"name": "Taobao"}
????mycol.delete_one(myquery)
????# 刪除后輸出
????for?x in?mycol.find():
????????print(x)
????myquery = {"name": {"$regex": "^F"}}
????x = mycol.delete_many(myquery)
????print(x.deleted_count, "個文檔已刪除")
????x = mycol.delete_many({})
????print(x.deleted_count, "個文檔已刪除")
????mycol.drop()
if?__name__ == "__main__":
????main()
輸出:
{'_id': ObjectId('5f05c10bfd36a6335af1c493'), 'name': 'QQ', 'alexa': '101', 'url': 'https://www.qq.com'}
{'_id': ObjectId('5f05c10bfd36a6335af1c494'), 'name': 'Facebook', 'alexa': '66666', 'url': 'https://www.facebook.com'}
{'_id': ObjectId('5f05c10bfd36a6335af1c495'), 'name': '知乎', 'alexa': '103', 'url': 'https://www.zhihu.com'}
{'_id': ObjectId('5f05c10bfd36a6335af1c496'), 'name': 'Github', 'alexa': '109', 'url': 'https://www.github.com'}
1?個文檔已刪除
3?個文檔已刪除
完
? 碼上加油站
? 一起來加油
長按掃碼關注

點“在看”你懂得
