pymongo庫:簡易方式存取數據

文檔

基礎使用

  1. 前提:開發機器已安裝mongo配置環境,已啟動服務。
    macOS啟動服務:brew services start mongodb-community@8.0
    macOS停止服務:brew services stop mongodb-community@8.0
  2. 安裝python3 -m pip install pymongo
  3. 導入import pymongo
  4. 與MongoClient建立連接client = MongoClient()
    from pymongo import MongoClient# 創建連接的三種方式:(任選一種即可)
    ## 第一種:使用默認的主機 localhost 和端口號 27017 創建連接
    client = MongoClient()
    ## 第二種:指定主機和端口創建連接
    client_1 = MongoClient("localhost", 27017)
    ## 第三種:使用url格式創建連接
    client_2 = MongoClient("mongodb://localhost:27017/")# 有賬號密碼時的連接
    client3 = MongoClient(f"mongodb://{username}:{password}@localhost:27017/mydatabase?authSource=admin")
    ## 或者使用獨立參數
    client4 = MongoClient(host='localhost',port=27017,username='your_username',password='your_password@123',authSource='admin',  # 認證數據庫
    )
    ## 若密碼包含特殊字符,則需要額外處理
    from urllib.parse import quote_plus
    safe_password = quote_plus("p@ssw:rd/$")
    
  5. 獲取數據庫db = client.test_database
    # 獲取數據庫的兩種方式:
    ## 第一種:通過 .數據庫名 獲取
    db = client.test_database
    ## 第二種:如果數據庫名含特殊字符,不能使用屬性樣式訪問時,可通過 字典式 訪問
    db1 = client['test-database']
    
  6. 收集(數據庫表)collection = db.test_collection
    # 獲取數據庫表的兩種方式:
    ## 第一種:通過 .表名 獲取
    collection = db.test_collection
    ## 第二種:如果表名含特殊字符,不能使用屬性樣式訪問時,可通過 字典式 訪問
    collection1 = db['test-collection']
    
  7. 文件(表數據):可以包含原生Python類型(如 datetime.datetime 實例),它們將自動轉換為相應的 BSON 類型。(二進制json格式)
    # 構造表數據
    import datetime
    post = {"author": "Mike","text": "My first blog post!","tags": ["mongodb", "python", "pymongo"],"date": datetime.datetime.now(tz=datetime.timezone.utc),
    }
    
  8. 插入文檔(將數據插入到數據庫表中):collection.insert_one(post)
    ??注意:由于延遲創建,此時(在向集合和數據庫中插入第一個文檔時)才會創建這些集合和數據庫。
    # 將文檔插入到集合中(即將數據插入到數據庫表)
    post_id = collection.insert_one(post).inserted_id
    print(post_id)  # 插入數據對應的id
    # 查看集合(數據庫表)
    db.list_collection_names()  # ['collection']
    
  9. 獲取單個文檔(獲取表中某個數據):result = collection.find_one({'key':'value'})
    ??注意:返回的文檔包含 “_id” ,在插入時自動添加。(也可以按{'_id': ObjectId(post_id)}來查找)
    # 默認獲取第一個數據
    collection.find_one()
    # 根據條件查找匹配的數據
    collection.find_one({'key':'value'})
    
  10. 大容量插入(批量插入多條數據):result = collection.insert_many(collection_data_list)
    new_posts = [{"author": "Mike","text": "Another post!","tags": ["bulk", "insert"],"date": datetime.datetime(2009, 11, 12, 11, 14),},{"author": "Eliot","title": "MongoDB is fun","text": "and pretty easy too!","date": datetime.datetime(2009, 11, 10, 10, 45),},
    ]
    result = collection.insert_many(new_posts)  # 參數為列表
    result.inserted_ids  # 可以獲取插入后的id列表
    
  11. 查詢多個文檔result = collection.find({'key':'value'}),result是在collection表內搜索key=value的結果列表。
  12. 計數
    • 獲取所有數據條數:collection.count_documents({})
    • 獲取特定條件的數據條數:collection.count_documents({"author": "Mike"})
  13. 范圍查詢collection.find({"date": {"$lt": date_value}}).sort("author"),查詢date_value日期之前的帖子,按作者對結果進行排序。
    d = datetime.datetime(2009, 11, 12, 12)
    result = collection.find({"date": {"$lt": d}}).sort("author")  # result是一個字典列表
    
  14. 索引:添加索引有助于加速某些查詢,還可以為查詢和存儲文檔添加附加功能。
    result = collection.create_index([("user_id", pymongo.ASCENDING)], unique=True)  # 將user_id設置為唯一索引
    indexs = sorted(list(collection.index_information()))  # 獲取collection表中已創建的索引列表
    

PyMongo 常用方法匯總

方法使用場景示例代碼關鍵特性
find()條件查詢、數據檢索db.users.find({"status": "active"}, {"name": 1, "email": 1})支持投影、排序、分頁鏈式操作
insert_one()插入單個文檔result = db.products.insert_one({"name": "Mouse", "price": 29.99})
print(result.inserted_id)
返回插入文檔的_id
insert_many()批量插入文檔users = [{"name": "Alice"}, {"name": "Bob"}]
result = db.users.insert_many(users, ordered=False)
支持有序/無序插入,返回插入ID列表
update_one()更新單個文檔db.users.update_one(
{"_id": 123},
{"$set": {"status": "active"}}
)
使用$set避免覆蓋整個文檔
update_many()批量更新文檔result = db.orders.update_many(
{"status": "pending"},
{"$inc": {"retries": 1}}
)
返回匹配和修改的文檔計數
delete_one()刪除單個文檔db.sessions.delete_one({"expire_at": {"$lt": datetime.now()}})刪除第一個匹配文檔
delete_many()批量刪除文檔result = db.logs.delete_many({"created": {"$lt": datetime(2023,1,1)}})
print(result.deleted_count)
返回刪除的文檔數量
count_documents()統計符合條件的文檔數量active_users = db.users.count_documents(
{"status": "active", "last_login": {"$gt": last_month}}
)
替代已廢棄的count()方法
distinct()獲取字段的唯一值列表categories = db.products.distinct("category")比聚合$group更高效
aggregate() ??復雜數據分析、多階段處理pipeline = [
{"$match": {"status": "active"}},
{"$group": {"_id": "$dept", "count": {"$sum": 1}}}
]
results = db.users.aggregate(pipeline)
支持 $match, $group, $lookup等聚合階段,先 $match過濾比較高效
find_one()查找單個文檔user = db.users.find_one({"email": "user@example.com"})直接返回文檔對象或None
find_one_and_update()原子查找并更新文檔task = db.tasks.find_one_and_update(
{"status": "pending"},
{"$set": {"status": "processing"}},
return_document=ReturnDocument.AFTER
)
保證操作的原子性
create_index()創建查詢索引db.orders.create_index([("user_id", 1), ("create_time", -1)])顯著提升查詢性能
bulk_write()高性能批量操作ops = [
UpdateOne({"id": 1}, {"$inc": {"views": 1}}),
DeleteMany({"expired": True})
]
result = db.collection.bulk_write(ops, ordered=False)
減少網絡往返,提升吞吐量,ordered=False無序操作更快
drop()刪除整個集合db.temp_data.drop()謹慎使用,不可逆操作

根據使用場景選擇對應的方法:
在這里插入圖片描述

aggregate中pipeline的核心聚合操作符速查表

操作符類別功能描述語法示例
$match篩選階段過濾文檔 (類似SQL的WHERE){"$match": {"status": "active"}}
$project重塑階段選擇/重命名字段 (類似SELECT){"$project": {"name": 1, "year": {"$year": "$date"}}}
$group分組階段按字段分組并計算聚合值{"$group": {"_id": "$dept", "total": {"$sum": "$salary"}}}
$sort排序階段結果排序 (1升序, -1降序){"$sort": {"age": -1, "name": 1}}
$limit限制階段限制輸出文檔數量{"$limit": 10}
$skip跳過階段跳過指定數量文檔{"$skip": 5}
$unwind數組處理展開數組為多條文檔{"$unwind": "$tags"}
$lookup關聯查詢跨集合關聯查詢 (類似SQL JOIN){"$lookup": {
"from": "products", # 關聯集合
"localField": "product_id", # 本地字段
"foreignField": "_id", # 關聯集合字段
"as": "product_info" # 輸出字段名}}
$addFields字段操作添加新字段 (不改變原字段){"$addFields": {"discount": {"$multiply": ["$price", 0.9]}}}
$count統計階段返回文檔總數{"$count": "total_users"}
$facet多管道處理同一輸入執行多個聚合管道pipeline = [ # 單次查詢獲取多種統計結果
{"$facet": {
"department_stats": [ # 部門統計管道
{"$group": {... }}],
"age_distribution": [ # 年齡分布管道
{"$bucket": {... }} ],
"total_count": [ # 總計數管道
{"$count": "value"} ]
}}]

在聚合管道中使用的核心表達式操作符:

類型操作符
算術運算$add, $subtract, $multiply, $divide, $mod
比較運算$eq, $ne, $gt, $gte, $lt, $lte, $cmp
邏輯運算$and, $or, $not, $cond (三元表達式)
日期處理$year, $month, $dayOfMonth, $hour, $minute, $dateToString
字符串處理$concat, $substr, $toLower, $toUpper, $trim, $split
數組處理$size, $slice, $map, $filter, $in, $arrayElemAt
數據類型$type, $convert, $toInt, $toString, $toDate
條件處理$ifNull, $switch (多分支條件)

聚合管道優化策略

  1. 管道順序優化原則

    輸入
    $match
    $project
    $lookup
    $unwind
    $group
    $sort
    $limit/skip
    輸出
  2. 性能優化技巧

    • $match$project 放在管道最前端減少數據處理量
    • $lookup 前使用 $match 過濾關聯集合數據
    • 避免在 $group 中使用 $push 操作大數組
    • $sort$match 使用的字段創建索引
    • 使用 allowDiskUse=True 處理大數據集
       result = collection.aggregate(pipeline, allowDiskUse=True)
      

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/915227.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/915227.shtml
英文地址,請注明出處:http://en.pswp.cn/news/915227.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java 線程池與多線程并發編程實戰全解析:從異步任務調度到設計模式落地,200 + 核心技巧、避坑指南與業務場景結合

多線程編程在現代軟件開發中扮演著至關重要的角色,它能夠顯著提升應用程序的性能和響應能力。通過合理利用異步線程、多線程以及線程池等技術,我們可以更高效地處理復雜任務,優化系統資源的使用。同時,在實際應用中,我…

gitee 分支切換

ssh-keygen -t rsa -C "pengchengzhangcplaser.com.cn" ssh -T gitgitee.comgit remote add origin 倉庫地址git config --global user.email "youexample.com"git config --global user.name "Your Name"# 1. 更新遠程信息 git fetch origin# …

Vue3生命周期函數

在 Vue 3 中,生命周期鉤子函數是指組件從創建到銷毀的整個過程中,Vue 自動調用的一些特定函數。它們讓你能夠在組件的不同階段執行一些自定義操作。Vue 3 提供了組合式 API 和選項式 API 兩種方式來定義生命周期鉤子。1. onBeforeMount (組合式 API)作用…

基于SEP3203微處理器的嵌入式最小硬件系統設計

目錄 1 引言 2 嵌入式最小硬件系統 3 SEP3202簡述 4 最小系統硬件的選擇和單元電路的設計 4.1 電源電路 4.2 晶振電路 4.3 復位及喚醒電路 4.5 存儲器 4.5.1 FLASH存儲 4.5.2 SDRAM 4.6 串行接口電路設計 4.7 JTAG模塊 4.8 擴展功能(LED) …

【開源軟件推薦】 SmartSub,一個可以快速識別視頻/音頻字幕的工具

背景介紹 我就說Github上面能找到好東西吧 事情是這樣的 我最近在用PC端的剪映剪輯視頻 需要用到它的語音轉字幕功能 轉完之后,導出的時候 發現 赫然有一項字幕識別的會員權益 我尋思看看什么價格 不貴的話就充了 好家伙,這不看不知道&#xff…

自動駕駛仿真領域常見開源工具

自動駕駛仿真領域常見開源工具1、目錄1.1 自動駕駛仿真領域常見開源2、地圖&場景2.1、場景播放器-Esmini4、被測對象-智駕軟件4.1、Autoware4.4、端到端模型-VAD4.5、端到端模型-UniAD4.6、端到端模型-ThinkTwice4.7、端到端模型-TCP5、評價方法5.1、Leaderboard5.2、Bench…

GPU算力租用平臺推薦,價格便宜且有羊毛薅,最低只要0.49/小時!

1.趨動云,這是我近期一直在用的,使用體驗還不錯,推薦給大家 網址:https://platform.virtaicloud.com/gemini_web/auth/register?inviteCode5f74065eac6d8867eac5c82194e2683a 是否選擇一個算力平臺我認為有幾點需要考慮&#xff…

python學智能算法(二十五)|SVM-拉格朗日乘數法理解

引言 前序學習進程中,已經對最佳超平面的求解有了一定認識。 剛好在此梳理一下: 函數距離 首先有函數距離F,也可以稱為函數間隔F: Fmin?i1...myi(w?xib)F \min_{i1...m}y_{i}(w \cdot x_{i}b)Fi1...mmin?yi?(w?xi?b) 幾何距離 然后…

vscode 源碼編譯

windows 環境 下載安裝 build tools Visual Studio Build Tools 勾選 C 因為安裝詳細信息里是 v143,所以單個組件里也要追加兩個 143 的勾選 點擊安裝,安裝好重啟下電腦 Electron 安裝失敗:connect ETIMEDOUT 20.205.243.166:443 為防Ele…

讀取和寫入json,xml文件

一、JSON文件操作? 1. 核心類?? ??QJsonDocument??:表示整個JSON文檔,提供解析(fromJson())和序列化(toJson())功能。 ??QJsonObject??:存儲鍵值對集合,支持嵌套對象和數…

深度學習×第10卷:她用一塊小濾鏡,在圖像中找到你

🌈【第一節 她看到的是像素點,卻試圖拼出你整張臉】📸 圖像是什么?她從未見過你,但看見的是你的一片光斑圖像,在神經網絡的眼里,是一個個數字格子。這些格子,每個都有 0~255 的亮度…

計算機組成原理中的RAM:核心技術深度解析

摘要:本文深度剖析RAM在計算機體系中的核心地位,結合2025年最新技術標準與實測數據,涵蓋DRAM工作原理、主流技術對比、非易失性存儲革新及未來發展趨勢,為硬件開發者和系統架構師提供權威技術參考。一、RAM基礎原理與系統交互機制…

C語言—深入理解指針(詳)

深入理解指針(詳解)前言一、指針是什么1、指針的定義2、指針的大小二、指針類型1、類型2、不同類型的意義三、野指針1、野指針形成原因2、如何避免野指針四、指針的運算1、 指針整數2、指針-指針3、指針的關系運算五、const修飾指針1、consr修飾變量2、c…

小談相機的學習過程

前言博主本人并非專職相機開發,還涉及系統的其他幾個模塊,雖然都屬于owner,但是都還在學習探索的一個過程,自認為掌握還不夠細致,此篇文章僅梳理,總結,印證自己近五年相機模塊的一個學習過程&am…

CentOS7 內網服務器yum修改

1、首先確定的內網服務器是有yum源代理服務器的2、修改 /etc/yum.conf 配置文件,增加代理ip和端口號proxyhttp://ip.ip.ip.ip:port3、備份源是文件sudo cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak4、修改配置文件 vi CentOS-Base…

基于單片機自行車自動防盜報警系統設計

摘 要 本文闡述了自行車防盜報警系統原理,介紹如何用stc89c52單片機實現防盜報警,分析各個部分的工作原理,并給出了原理圖和源程序。此設計電路由震動傳感器、單片機、無線超再生發射/接收電路、LED顯示器和蜂鳴器組成。由于超再生接收是一種…

【深度學習】神經網絡反向傳播算法-part4

七、反向傳播算法反向傳播Back Propagation 簡稱 BP 。 訓練神經網絡的核心算法之一,通過計算損失函數,相對于每個權重參數的梯度,來優化神經網絡的權重1. 前向傳播前向傳播是把數據經過各層神經元的運算并逐層向前傳輸,知道輸出層…

CTF之服務器端模板注入(SSTI)與賽題

概念定義服務器端模板注入(Server-Side Template Injection)服務端接受攻擊者的輸入,將其作為Web應用內容的一部分,在進行代碼編譯渲染的過程中,進行了語句的拼接,執行了所插入的惡意內容,從而導致信息泄露、代碼執行、…

除了某信,就是這款軟件來替代了!

引言 哈嘍,我是小索奇。有時候會有一個普遍的需求,想在幾個設備之間傳個文件或者發個消息,除了微信,想一想你還能用什么軟件? 今天就是為了解決這個問題,給大家介紹一款軟件 Localsend 來解決。 內容模塊…

Vue2.x封裝預覽PDF組件

一、為什么用PDFObject插件? PDFObject 是一個輕量級的 JavaScript 庫,主要用于在網頁中嵌入和預覽 PDF 文件。它通過簡單的 API 調用,可以在瀏覽器中實現 PDF 文件的顯示,而無需依賴任何插件。以下將詳細介紹 PDFObject 的特點、…