Python使用PyMongo4.x操作MongoDB的教程分享
概述
PyMongo是一個(gè)Python編程語言中用于連接和操作MongoDB數(shù)據(jù)庫的庫。它提供了豐富的功能和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庫
pip install pymongo==4.3.3
注意:不同版本的PyMongo在語法和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ù)庫,默認(rèn)為None,表示使用admin數(shù)據(jù)庫 ''' 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ù)庫、集合
# 判斷數(shù)據(jù)庫是否已存在 dblist = client.list_database_names() if "demo" in dblist: print("demo 數(shù)據(jù)庫已存在!") # 創(chuàng)建、獲取數(shù)據(jù)庫對(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ù)庫創(chuàng)建后要?jiǎng)?chuàng)建集合(數(shù)據(jù)表)并插入一個(gè)文檔(記錄),數(shù)據(jù)庫才會(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 字段的值。如果文檔沒有設(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 方法來查詢集合中的數(shù)據(jù),它類似于 SQL 中的 SELECT 語句。
查詢單條
使用 find_one()方法來查詢集合中的一條數(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() 方法來查詢指定字段的數(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í)查詢
查詢條件語句中使用修飾符
# 查詢年齡大于等于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) | 描述 | 示例 | 說明 |
---|---|---|---|
$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ù) |
其他常見操作符
符號(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() 方法來刪除一個(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() 方法來刪除多個(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()方法來刪除一個(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)來實(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)文章
OpenCV2.3.1+Python2.7.3+Numpy等的配置解析
這篇文章主要介紹了OpenCV2.3.1+Python2.7.3+Numpy等的配置解析,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01Pycharm2020最新激活碼|永久激活(附最新激活碼和插件的詳細(xì)教程)
這篇文章主要介紹了Pycharm2020最新激活碼|永久激活(附最新激活碼和插件的詳細(xì)教程),本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09po+selenium+unittest自動(dòng)化測(cè)試項(xiàng)目實(shí)戰(zhàn)
本文主要介紹了po+selenium+unittest自動(dòng)化測(cè)試項(xiàng)目實(shí)戰(zhàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12