Python使用PyMongo4.x操作MongoDB的教程分享
概述
PyMongo是一個(gè)Python編程語(yǔ)言中用于連接和操作MongoDB數(shù)據(jù)庫(kù)的庫(kù)。它提供了豐富的功能和API,使開發(fā)者能夠在Python中輕松地進(jìn)行MongoDB的數(shù)據(jù)交互和管理。
MongoDB 驅(qū)動(dòng)程序:https://api.mongodb.com/
PyMongo文檔:https://pymongo.readthedocs.io/en/stable/api/index.html
MongoDB文檔:https://www.mongodb.com/docs/manual/
安裝Python庫(kù)
pip install pymongo==4.3.3
注意:不同版本的PyMongo在語(yǔ)法和API方面可能會(huì)有差異一定差異
連接、認(rèn)證
# 導(dǎo)入模塊 from pymongo import * # 創(chuàng)建客戶端對(duì)象,使用賬號(hào)登錄 # 方式一: ''' host:連接的主機(jī)名或IP地址,默認(rèn)為localhost port:連接使用的端口號(hào),默認(rèn)為27017 username:用于身份驗(yàn)證的用戶名,默認(rèn)為None password:用于身份驗(yàn)證的密碼,默認(rèn)為None authSource:用于身份驗(yàn)證的數(shù)據(jù)庫(kù),默認(rèn)為None,表示使用admin數(shù)據(jù)庫(kù) ''' client = MongoClient(host="112.74.96.150", port=27017, username="test", password="123456", authSource="demo") # 方式二: # url = "mongodb://test:123456@112.74.96.150/demo" # client = MongoClient(url) # 斷開與MongoDB的連接 client.close()
創(chuàng)建數(shù)據(jù)庫(kù)、集合
# 判斷數(shù)據(jù)庫(kù)是否已存在
dblist = client.list_database_names()
if "demo" in dblist:
print("demo 數(shù)據(jù)庫(kù)已存在!")
# 創(chuàng)建、獲取數(shù)據(jù)庫(kù)對(duì)象
db = client.demo
db = client['demo']
# 判斷集合是否存在
collist = db . list_collection_names()
if "user" in collist:
print("user 集合已存在!")
# 創(chuàng)建、獲取集合
collection = db.user
collection = db["user"]注意: 在 MongoDB 中,數(shù)據(jù)庫(kù)創(chuàng)建后要?jiǎng)?chuàng)建集合(數(shù)據(jù)表)并插入一個(gè)文檔(記錄),數(shù)據(jù)庫(kù)才會(huì)真正創(chuàng)建。
新增
MongoDB 中的一個(gè)文檔類似 SQL 表中的一條記錄。
單條插入
集合中插入一個(gè)文檔使用
insert_one()方法,該方法的第一參數(shù)是字典
result = collection.insert_one({"name": "Python", "age": 25})
# 插入操作是否被確認(rèn)
print(result.acknowledged) # True
# 插入文檔的 _id 字段的值。如果文檔沒(méi)有設(shè)置 _id 字段,則 inserted_id 的值為一個(gè)新生成的 ObjectId。
print(result.inserted_id) # 63f569b89a8014989e3b53f6
# 批量插入
result = collection.insert_many([{"name": "Java", "age": 55}, {"name": "Vue", "age": 33}])
# 插入操作是否被確認(rèn)
print(result.acknowledged) # True
# 插入的所有文檔的 _id 值的列表。
print(result.inserted_ids) # [ObjectId('63f569b89a8014989e3b53f7'), ObjectId('63f569b89a8014989e3b53f8')]批量插入
集合中插入多個(gè)文檔使用 insert_many() 方法,該方法的第一參數(shù)是字典列表
result = collection.insert_many([{"name": "Java", "age": 55}, {"name": "Vue", "age": 33}])
# 插入操作是否被確認(rèn)
print(result.acknowledged) # True
# 插入的所有文檔的 _id 值的列表。
print(result.inserted_ids) # [ObjectId('63f569b89a8014989e3b53f7'), ObjectId('63f569b89a8014989e3b53f8')]查詢
MongoDB 中使用了 find 和 find_one 方法來(lái)查詢集合中的數(shù)據(jù),它類似于 SQL 中的 SELECT 語(yǔ)句。
查詢單條
使用 find_one()方法來(lái)查詢集合中的一條數(shù)據(jù)
result = collection.find_one({"name": "Python"})
print(result)查詢多條
使用find() 方法查詢集合中的所有數(shù)據(jù)
rows = collection.find({"name": "Python"})
for row in rows:
print(row)查詢指定字段的數(shù)據(jù)
使用 find() 方法來(lái)查詢指定字段的數(shù)據(jù),將要返回的字段對(duì)應(yīng)值設(shè)置為 1
注意:除了
_id,不能在一個(gè)對(duì)象中同時(shí)指定 0 和 1
rows = collection.find({},{ "_id": 0, "name": 1, "age": 1 }):
for x in
print(x)高級(jí)查詢
查詢條件語(yǔ)句中使用修飾符
# 查詢年齡大于等于30
query = { "age": { "$gte": 30 } }
result = collection.find(query)
for document in result:
print(document)使用正則表達(dá)式查詢
可以使用正則表達(dá)式作為修飾符
# 查看name 字段中以字母'java'開頭的數(shù)據(jù)
query = { "name": { "$regex": "^java" } }
result = collection.find(query)
for document in result:
print(document)返回指定條數(shù)記錄
要對(duì)查詢結(jié)果設(shè)置指定條數(shù)的記錄可以使用 limit() 方法,該方法只接受一個(gè)數(shù)字參數(shù)
result = collection.find().limit(3) for x in result: print(x)
查詢選擇器
比較操作符
| 符號(hào) | 描述 | 示例 |
|---|---|---|
| $eq | 匹配等于指定值的值 | {'age': {'$eq': 20}} |
| $lt | 匹配小于指定值的值 | {'age': {'$lt': 20}} |
| $lte | 匹配小于或等于指定值的值 | {'age': {'$lte': 20}} |
| $gt | 匹配大于指定值的值 | {'age': {'$gt': 20}} |
| $gte | 匹配大于或等于指定值的值 | {'age': {'$gte': 20}} |
| $ne | 匹配所有不等于指定值的值 | {'age': {'$ne': 20}} |
| $in | 匹配數(shù)組中指定的任何值 | {'age': {'$in': [20, 30]}} |
| $nin | 不匹配數(shù)組中指定的任何值 | {'age': {'$nin': [20, 30]}} |
邏輯操作符
| 符號(hào) | 描述 | 示例 | 說(shuō)明 |
|---|---|---|---|
| $and | 查詢同時(shí)滿足多個(gè)條件的文檔 | query = { "$and": [ {"name": "electronics"}, {"age": {"$lt": 30}} ] } result = collection.find(query) | 查詢了name為"electronics"且age小于30的數(shù)據(jù) |
| $not | 查詢不滿足指定條件的文檔 | query = { "age": { "$not": {"$gt": 50} # 不大于50 } } | 查詢了age不大于50的數(shù)據(jù) |
| $nor | 查詢不滿足任何指定條件的文檔 | query = { "$nor": [ {"name": "electronics"}, {"age": {"$gt": 50}} ] } | 查詢name既不屬于"electronics",也不滿足age大于50的數(shù)據(jù) |
| $or | 查詢滿足任意一個(gè)指定條件的文檔 | query = { "$or": [ {"name": "electronics"}, {"age": {"$gt": 50}} ] } | 查詢了name滿足"electronics"或age大于50的數(shù)據(jù) |
其他常見(jiàn)操作符
| 符號(hào) | 描述 | 示例 |
|---|---|---|
| $regex | 匹配正則表達(dá)式 | {'name': {'$regex': '^java.*'}} |
| $exists | 屬性是否存在 | {'name': {'$exists': True}} |
| $text | 文本查詢 | {'$text': {'$search': 'java'}} |
| $where | 高級(jí)條件查詢 | {'$where': 'this.name.length > 5'} |
| $type | 類型判斷 | {'age': {'$type': 'int'}} |
| $mod | 對(duì)字段進(jìn)行取模運(yùn)算 這里:5是除數(shù),0是余數(shù) | {'age': {'$mod': [5, 0]}} |
更新
更新單條
使用
update_one()方法修改文檔中的記錄,方法第一個(gè)參數(shù)為查詢的條件,第二個(gè)參數(shù)為要修改的字段。
如果查找到的匹配數(shù)據(jù)多于一條,則只會(huì)修改第一條
'''
matched_count:符合篩選條件的文檔數(shù)
modified_count:實(shí)際被更新的文檔數(shù)
upserted_id:如果執(zhí)行的是 upsert 操作,則包含新插入文檔的 _id 值
'''
result = collection.update_one({"name": "Python"}, {"$set": {"age": 25}})
print(result.matched_count)
print(result.modified_count)
print(result.upserted_id)
# 不存在就插入
data = {"name": "Python", "age": 25}
client.test.test.update_one({'name': 'Java'}, {'$set': data}, upsert=True)批量更新
使用update_many()方法修改多個(gè)文檔中的記錄,會(huì)修改所有匹配到的記錄
collection.update_many({"name": "Python"}, {"$set": {"age": 22}})
# 不存在就插入
data = {"name": "Python", "age": 25}
client.test.test.update_one({'name': 'Java'}, {'$set': data}, upsert=True)刪除
刪除文檔
使用 delete_one() 方法來(lái)刪除一個(gè)文檔,該方法第一個(gè)參數(shù)為查詢對(duì)象,指定要?jiǎng)h除哪些數(shù)據(jù)
'''
acknowledged:一個(gè)布爾值,表示操作是否被確認(rèn)(即是否執(zhí)行成功)
deleted_count:一個(gè)整數(shù),表示被刪除的文檔數(shù)量
'''
result = collection.delete_one({"name": "Python"})
print(result.acknowledged)
print(result.deleted_count)批量刪除
使用 delete_many() 方法來(lái)刪除多個(gè)文檔,該方法第一個(gè)參數(shù)為查詢對(duì)象,指定要?jiǎng)h除哪些數(shù)據(jù)
collection.delete_many({"age": {"$gt": 20}})刪除集合中的所有文檔
delete_many() 方法如果傳入的是一個(gè)空的查詢對(duì)象,則會(huì)刪除集合中的所有文檔
x = user.delete_many({})
print(x.deleted_count, "個(gè)文檔已刪除")
db.user.delete_many({})刪除集合
使用drop()方法來(lái)刪除一個(gè)集合。
# 返回true:刪除成功 # 返回false:刪除失敗(集合不存在) collection.drop()
其他
排序
sort()方法可以指定升序或降序排序。
第一個(gè)參數(shù)為要排序的字段,第二個(gè)字段指定排序規(guī)則,1為升序,-1為降序,默認(rèn)為升序。
升序
result = collection.find().sort("age")
for x in result:
print(x)降序
result = collection.find().sort("age", -1)
for x in result:
print(x)計(jì)數(shù)
可以使用
count()方法查詢結(jié)果有多少條數(shù)據(jù)
count = collection.find().count()
query = { "age": { "$gte": 30 } }
count = collection.find(query).count()分組查詢
在MongoDB中,可以使用聚合管道(aggregation pipeline)來(lái)實(shí)現(xiàn)分組查詢
# 構(gòu)建聚合管道
pipeline = [
{"$group": {"_id": "$category", "total_sales": {"$sum": "$amount"}}},
{"$sort": {"total_sales": -1}},
{"$limit": 3}
]
# 執(zhí)行聚合查詢
result = collection.aggregate(pipeline)
for document in result:
print(document)以上就是Python使用PyMongo4.x操作MongoDB的詳細(xì)內(nèi)容,更多關(guān)于PyMongo4.x操作MongoDB的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
mac安裝python3后使用pip和pip3的區(qū)別說(shuō)明
這篇文章主要介紹了mac安裝python3后使用pip和pip3的區(qū)別說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09
python之http請(qǐng)求模擬器(tk)使用及說(shuō)明
文章總結(jié)了使用Python和Tkinter創(chuàng)建一個(gè)HTTP請(qǐng)求模擬器的經(jīng)驗(yàn),提供了代碼示例,并鼓勵(lì)讀者參考和支持腳本之家2026-01-01
Python開發(fā)必備知識(shí)內(nèi)存管理與垃圾回收
Python是一種高級(jí)編程語(yǔ)言,因其簡(jiǎn)潔而強(qiáng)大而備受歡迎,然而如其他編程語(yǔ)言一樣,Python也面臨著內(nèi)存管理的挑戰(zhàn),在Python中,垃圾回收是一項(xiàng)關(guān)鍵任務(wù),用于自動(dòng)釋放不再使用的內(nèi)存,以避免內(nèi)存泄漏,本文將介紹Python中的垃圾回收機(jī)制,以及如何通過(guò)優(yōu)化代碼來(lái)提高性能2023-11-11
python編程使用PyQt制作預(yù)覽窗口游戲中的小地圖
這篇文章主要為大家介紹了python使用PyQt制作預(yù)覽窗口游戲中的小地圖實(shí)現(xiàn)示例過(guò)程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-10-10
Django外鍵(ForeignKey)操作以及related_name的作用詳解
這篇文章主要介紹了Django外鍵(ForeignKey)操作以及related_name的作用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
python簡(jiǎn)單的三元一次方程求解實(shí)例
這篇文章主要介紹了python簡(jiǎn)單的三元一次方程求解實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04
python實(shí)現(xiàn)簡(jiǎn)單的貪吃蛇游戲
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)簡(jiǎn)單的貪吃蛇游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-03-03
使用python調(diào)用llama3進(jìn)行對(duì)話的操作步驟
Meta?已將最新的?LLaMa3?進(jìn)行了開源,因此,我們也可以方便的使用?Python?進(jìn)行?LLaMa3?模型的調(diào)用和開發(fā),本文給大家介紹了如何使用?python?調(diào)用?llama3?進(jìn)行對(duì)話,需要的朋友可以參考下2024-09-09
python實(shí)現(xiàn)將元祖轉(zhuǎn)換成數(shù)組的方法
這篇文章主要介紹了python實(shí)現(xiàn)將元祖轉(zhuǎn)換成數(shù)組的方法,涉及Python中l(wèi)ist方法的使用技巧,需要的朋友可以參考下2015-05-05

