Python使用PyMongo4.x操作MongoDB的教程分享
概述
PyMongo是一個Python編程語言中用于連接和操作MongoDB數(shù)據(jù)庫的庫。它提供了豐富的功能和API,使開發(fā)者能夠在Python中輕松地進行MongoDB的數(shù)據(jù)交互和管理。
MongoDB 驅(qū)動程序: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方面可能會有差異一定差異
連接、認證
# 導入模塊 from pymongo import * # 創(chuàng)建客戶端對象,使用賬號登錄 # 方式一: ''' host:連接的主機名或IP地址,默認為localhost port:連接使用的端口號,默認為27017 username:用于身份驗證的用戶名,默認為None password:用于身份驗證的密碼,默認為None authSource:用于身份驗證的數(shù)據(jù)庫,默認為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ù)庫對象 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)建后要創(chuàng)建集合(數(shù)據(jù)表)并插入一個文檔(記錄),數(shù)據(jù)庫才會真正創(chuàng)建。
新增
MongoDB 中的一個文檔類似 SQL 表中的一條記錄。
單條插入
集合中插入一個文檔使用
insert_one()
方法,該方法的第一參數(shù)是字典
result = collection.insert_one({"name": "Python", "age": 25}) # 插入操作是否被確認 print(result.acknowledged) # True # 插入文檔的 _id 字段的值。如果文檔沒有設(shè)置 _id 字段,則 inserted_id 的值為一個新生成的 ObjectId。 print(result.inserted_id) # 63f569b89a8014989e3b53f6 # 批量插入 result = collection.insert_many([{"name": "Java", "age": 55}, {"name": "Vue", "age": 33}]) # 插入操作是否被確認 print(result.acknowledged) # True # 插入的所有文檔的 _id 值的列表。 print(result.inserted_ids) # [ObjectId('63f569b89a8014989e3b53f7'), ObjectId('63f569b89a8014989e3b53f8')]
批量插入
集合中插入多個文檔使用 insert_many() 方法,該方法的第一參數(shù)是字典列表
result = collection.insert_many([{"name": "Java", "age": 55}, {"name": "Vue", "age": 33}]) # 插入操作是否被確認 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ù),將要返回的字段對應值設(shè)置為 1
注意:除了
_id
,不能在一個對象中同時指定 0 和 1
rows = collection.find({},{ "_id": 0, "name": 1, "age": 1 }): for x in print(x)
高級查詢
查詢條件語句中使用修飾符
# 查詢年齡大于等于30 query = { "age": { "$gte": 30 } } result = collection.find(query) for document in result: print(document)
使用正則表達式查詢
可以使用正則表達式作為修飾符
# 查看name 字段中以字母'java'開頭的數(shù)據(jù) query = { "name": { "$regex": "^java" } } result = collection.find(query) for document in result: print(document)
返回指定條數(shù)記錄
要對查詢結(jié)果設(shè)置指定條數(shù)的記錄可以使用 limit() 方法,該方法只接受一個數(shù)字參數(shù)
result = collection.find().limit(3) for x in result: print(x)
查詢選擇器
比較操作符
符號 | 描述 | 示例 |
---|---|---|
$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]}} |
邏輯操作符
符號 | 描述 | 示例 | 說明 |
---|---|---|---|
$and | 查詢同時滿足多個條件的文檔 | 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 | 查詢滿足任意一個指定條件的文檔 | query = { "$or": [ {"name": "electronics"}, {"age": {"$gt": 50}} ] } | 查詢了name滿足"electronics"或age大于50的數(shù)據(jù) |
其他常見操作符
符號 | 描述 | 示例 |
---|---|---|
$regex | 匹配正則表達式 | {'name': {'$regex': '^java.*'}} |
$exists | 屬性是否存在 | {'name': {'$exists': True}} |
$text | 文本查詢 | {'$text': {'$search': 'java'}} |
$where | 高級條件查詢 | {'$where': 'this.name.length > 5'} |
$type | 類型判斷 | {'age': {'$type': 'int'}} |
$mod | 對字段進行取模運算 這里:5是除數(shù),0是余數(shù) | {'age': {'$mod': [5, 0]}} |
更新
更新單條
使用
update_one()
方法修改文檔中的記錄,方法第一個參數(shù)為查詢的條件,第二個參數(shù)為要修改的字段。
如果查找到的匹配數(shù)據(jù)多于一條,則只會修改第一條
''' matched_count:符合篩選條件的文檔數(shù) modified_count:實際被更新的文檔數(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()方法修改多個文檔中的記錄,會修改所有匹配到的記錄
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() 方法來刪除一個文檔,該方法第一個參數(shù)為查詢對象,指定要刪除哪些數(shù)據(jù)
''' acknowledged:一個布爾值,表示操作是否被確認(即是否執(zhí)行成功) deleted_count:一個整數(shù),表示被刪除的文檔數(shù)量 ''' result = collection.delete_one({"name": "Python"}) print(result.acknowledged) print(result.deleted_count)
批量刪除
使用 delete_many() 方法來刪除多個文檔,該方法第一個參數(shù)為查詢對象,指定要刪除哪些數(shù)據(jù)
collection.delete_many({"age": {"$gt": 20}})
刪除集合中的所有文檔
delete_many() 方法如果傳入的是一個空的查詢對象,則會刪除集合中的所有文檔
x = user.delete_many({}) print(x.deleted_count, "個文檔已刪除") db.user.delete_many({})
刪除集合
使用drop()方法來刪除一個集合。
# 返回true:刪除成功 # 返回false:刪除失敗(集合不存在) collection.drop()
其他
排序
sort()
方法可以指定升序或降序排序。
第一個參數(shù)為要排序的字段,第二個字段指定排序規(guī)則,1為升序,-1為降序,默認為升序。
升序
result = collection.find().sort("age") for x in result: print(x)
降序
result = collection.find().sort("age", -1) for x in result: print(x)
計數(shù)
可以使用
count()
方法查詢結(jié)果有多少條數(shù)據(jù)
count = collection.find().count() query = { "age": { "$gte": 30 } } count = collection.find(query).count()
分組查詢
在MongoDB中,可以使用聚合管道(aggregation pipeline)來實現(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的詳細內(nèi)容,更多關(guān)于PyMongo4.x操作MongoDB的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
OpenCV2.3.1+Python2.7.3+Numpy等的配置解析
這篇文章主要介紹了OpenCV2.3.1+Python2.7.3+Numpy等的配置解析,具有一定借鑒價值,需要的朋友可以參考下2018-01-01Pycharm2020最新激活碼|永久激活(附最新激活碼和插件的詳細教程)
這篇文章主要介紹了Pycharm2020最新激活碼|永久激活(附最新激活碼和插件的詳細教程),本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-09-09po+selenium+unittest自動化測試項目實戰(zhàn)
本文主要介紹了po+selenium+unittest自動化測試項目實戰(zhàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-12-12