Python 操作 MongoDB 教程

一、引言

在當今數字化時代,數據的存儲和管理至關重要。傳統的關系型數據庫在處理一些復雜場景時可能會顯得力不從心,而 NoSQL 數據庫應運而生。MongoDB 作為一款開源的、面向文檔的 NoSQL 數據庫,憑借其高性能、高可擴展性和靈活的數據模型,在眾多領域得到了廣泛應用。Python 作為一門功能強大且易于學習的編程語言,擁有豐富的庫和工具。pymongo?庫為 Python 與 MongoDB 之間搭建了一座橋梁,使得開發者可以方便地在 Python 代碼中操作 MongoDB 數據庫。本教程將詳細介紹如何在 Python 中使用?pymongo?庫來操作 MongoDB,從基礎的連接、數據操作到高級的索引和聚合操作,讓你全面掌握 Python 與 MongoDB 的結合使用。

二、MongoDB 概念介紹

2.1 數據模型

MongoDB 采用面向文檔的數據模型,數據以文檔(Document)的形式存儲。文檔是一個由鍵值對組成的結構,類似于 Python 中的字典,使用 BSON(Binary JSON)格式存儲,它是 JSON 的二進制擴展,支持更多的數據類型,如日期、二進制數據等。多個相關的文檔組成一個集合(Collection),類似于關系數據庫中的表。而多個集合則構成一個數據庫(Database)。

2.2 應用場景

  • 內容管理系統:可以輕松存儲和管理各種類型的內容,如文章、圖片、視頻等,并且可以靈活地擴展文檔結構以適應不同的內容需求。
  • 日志記錄:處理大量的日志數據,由于其高性能的寫入能力和靈活的數據模型,能夠快速存儲日志信息,并方便后續的查詢和分析。
  • 實時分析:對于需要實時處理和分析數據的場景,MongoDB 可以高效地存儲和處理實時數據,支持復雜的查詢和聚合操作。
  • 移動應用后端:為移動應用提供數據存儲和管理服務,支持多設備的數據同步和實時更新。

三、安裝與環境準備

3.1 安裝 MongoDB

首先,你需要在本地或者服務器上安裝 MongoDB 數據庫。可以從 MongoDB 官方網站(Download MongoDB Community Server | MongoDB)下載適合你操作系統的安裝包,并按照安裝向導進行安裝。安裝完成后,啟動 MongoDB 服務。

3.2 安裝?pymongo?庫

使用?pip?命令來安裝?pymongo?庫:?

pip install pymongo

四、連接到 MongoDB

在 Python 中使用?pymongo?連接到 MongoDB 服務器非常簡單,以下是一個示例代碼:

from pymongo import MongoClient# 創建一個 MongoClient 對象,連接到本地的 MongoDB 服務器,默認端口為 27017
client = MongoClient('mongodb://localhost:27017/')# 選擇一個數據庫,如果該數據庫不存在,MongoDB 會在插入數據時自動創建
db = client['test_database']

?五、集合操作

在 MongoDB 中,數據以集合(類似于關系數據庫中的表)的形式組織。以下是一些常見的集合操作示例:

5.1 創建集合

# 創建一個名為 test_collection 的集合
# 如果集合不存在,MongoDB 會在插入數據時自動創建
collection = db['test_collection']

5.2 查看所有集合

# 獲取數據庫中的所有集合名稱
collection_names = db.list_collection_names()
print("數據庫中的所有集合名稱:", collection_names)

5.3 刪除集合

# 刪除 test_collection 集合
db['test_collection'].drop()
print("test_collection 集合已刪除")

六、文檔操作

在 MongoDB 中,數據以文檔(類似于關系數據庫中的行)的形式存儲在集合中。文檔是一個由鍵值對組成的 BSON 對象。

6.1 插入文檔

# 插入單個文檔
# 定義一個文檔,包含姓名、年齡和城市信息
document = {'name': 'Alice', 'age': 25, 'city': 'New York'}
# 使用 insert_one 方法插入單個文檔
result = collection.insert_one(document)
print(f"插入的單個文檔 ID: {result.inserted_id}")# 插入多個文檔
# 定義一個包含多個文檔的列表
documents = [{'name': 'Bob', 'age': 30, 'city': 'Los Angeles'},{'name': 'Charlie', 'age': 35, 'city': 'Chicago'}
]
# 使用 insert_many 方法插入多個文檔
result = collection.insert_many(documents)
print(f"插入的多個文檔 ID: {result.inserted_ids}")

6.2 查詢文檔

# 查詢單個文檔
# 定義查詢條件,查找姓名為 Alice 的文檔
query = {'name': 'Alice'}
# 使用 find_one 方法查詢單個文檔
result = collection.find_one(query)
print("查詢到的單個文檔:", result)# 查詢多個文檔
# 定義查詢條件,查找年齡大于 28 的文檔
results = collection.find({'age': {'$gt': 28}})
print("查詢到的多個文檔:")
for result in results:print(result)

6.3 更新文檔

# 更新單個文檔
# 定義查詢條件,查找姓名為 Alice 的文檔
filter_query = {'name': 'Alice'}
# 定義更新操作,將年齡更新為 26
update_query = {'$set': {'age': 26}}
# 使用 update_one 方法更新單個文檔
result = collection.update_one(filter_query, update_query)
print(f"更新的單個文檔數量: {result.modified_count}")# 更新多個文檔
# 定義查詢條件,查找城市為 New York 的文檔
filter_query = {'city': 'New York'}
# 定義更新操作,將年齡加 1
update_query = {'$inc': {'age': 1}}
# 使用 update_many 方法更新多個文檔
result = collection.update_many(filter_query, update_query)
print(f"更新的多個文檔數量: {result.modified_count}")

6.4 刪除文檔

# 刪除單個文檔
# 定義查詢條件,查找姓名為 Alice 的文檔
filter_query = {'name': 'Alice'}
# 使用 delete_one 方法刪除單個文檔
result = collection.delete_one(filter_query)
print(f"刪除的單個文檔數量: {result.deleted_count}")# 刪除多個文檔
# 定義查詢條件,查找年齡小于 30 的文檔
filter_query = {'age': {'$lt': 30}}
# 使用 delete_many 方法刪除多個文檔
result = collection.delete_many(filter_query)
print(f"刪除的多個文檔數量: {result.deleted_count}")

七、索引操作

索引可以提高查詢性能,以下是創建和刪除索引的示例:

7.1 創建索引

# 在 name 字段上創建升序索引
# 提高根據姓名查詢文檔的性能
collection.create_index([('name', 1)])
print("在 name 字段上創建了升序索引")

7.2 刪除索引

# 刪除 name 字段上的索引
collection.drop_index('name_1')
print("刪除了 name 字段上的索引")

八、聚合操作

聚合操作是 MongoDB 提供的一個強大功能,它允許我們對數據進行復雜的處理和分析,如分組、統計、排序等。

聚合操作通過聚合管道(Aggregation Pipeline)來實現,聚合管道由多個階段(Stage)組成,每個階段對輸入的文檔進行特定的處理,并將處理結果傳遞給下一個階段。常見的階段包括?$match(篩選文檔)、$group(分組)、$project(投影)、$sort(排序)、$limit(限制結果數量)等。

以下是一個簡單的聚合管道示例,用于按城市分組并統計每個城市的文檔數量:

from pymongo import MongoClient# 連接到 MongoDB 服務器
client = MongoClient('mongodb://localhost:27017/')
# 選擇數據庫
db = client['test_database']
# 選擇集合
collection = db['test_collection']pipeline = [{'$group': {'_id': '$city', 'count': {'$sum': 1}}}
]
results = collection.aggregate(pipeline)
for result in results:print(result)

?8.1 結合?$match?和?$group?進行篩選和分組

假設我們想要統計年齡大于 25 歲的人在每個城市的數量。可以先使用?$match?階段篩選出年齡大于 25 歲的文檔,再使用?$group?階段按城市分組并統計數量。

pipeline = [{'$match': {'age': {'$gt': 25}}},{'$group': {'_id': '$city', 'count': {'$sum': 1}}}
]
results = collection.aggregate(pipeline)
for result in results:print(result)

8.2 使用?$project?進行投影操作

投影操作可以選擇要返回的字段,還可以對字段進行計算和重命名。以下示例將返回每個文檔的姓名和年齡,并將年齡乘以 2 后重命名為?double_age

pipeline = [{'$project': {'name': 1, 'double_age': {'$multiply': ['$age', 2]}, '_id': 0}}
]
results = collection.aggregate(pipeline)
for result in results:print(result)

?8.3 結合?$sort?進行排序

假設我們想要按年齡降序排列文檔,并返回前 2 條記錄。可以使用?$sort?階段進行排序,再使用?$limit?階段限制結果數量。

pipeline = [{'$sort': {'age': -1}},{'$limit': 2}
]
results = collection.aggregate(pipeline)
for result in results:print(result)

8.4 計算平均值

使用?$group?和?$avg?操作符可以計算某個字段的平均值。以下示例計算所有人的平均年齡。

pipeline = [{'$group': {'_id': None, 'average_age': {'$avg': '$age'}}}
]
results = collection.aggregate(pipeline)
for result in results:print(result)

?8.5 字符串拼接

在?$project?階段可以使用?$concat?操作符進行字符串拼接。以下示例將姓名和城市拼接成一個新的字段?info

pipeline = [{'$project': {'info': {'$concat': ['$name', ' lives in ', '$city']}, '_id': 0}}
]
results = collection.aggregate(pipeline)
for result in results:print(result)

8.6 多級分組

可以進行多級分組操作,例如先按城市分組,再按年齡范圍分組。以下示例將數據先按城市分組,再在每個城市中按年齡是否大于 30 歲進行分組,并統計數量。?

pipeline = [{'$group': {'_id': {'city': '$city','age_group': {'$cond': [{'$gt': ['$age', 30]}, 'Over 30', 'Under 30']}},'count': {'$sum': 1}}}
]
results = collection.aggregate(pipeline)
for result in results:print(result)

8.7 使用?$lookup?進行關聯查詢

假設我們有兩個集合:orders?和?productsorders?集合中的每個文檔包含一個?product_id?字段,用于關聯?products?集合中的產品信息。可以使用?$lookup?階段進行關聯查詢,將兩個集合的數據進行合并。

# 假設已經有 orders 和 products 集合
orders_collection = db['orders']
products_collection = db['products']pipeline = [{'$lookup': {'from': 'products','localField': 'product_id','foreignField': '_id','as': 'product_info'}}
]
results = orders_collection.aggregate(pipeline)
for result in results:print(result)

?8.8、聚合小結

MongoDB 的聚合操作提供了豐富而強大的功能,通過不同階段的組合,可以對數據進行各種復雜的處理和分析。這里通過多個范例展示了聚合操作在篩選、分組、投影、排序、計算統計值、字符串處理、關聯查詢等方面的應用。在實際項目中,你可以根據具體需求靈活運用這些范例,結合不同的階段和操作符,實現更復雜的數據處理和分析任務。希望這些范例能幫助你更好地掌握 MongoDB 的聚合操作,提升數據處理和分析的能力。

九、總結

通過本教程,你全面學習了如何在 Python 中使用?pymongo?庫來連接 MongoDB 服務器,進行集合和文檔的操作,創建和刪除索引,以及使用聚合框架進行數據處理。MongoDB 的靈活性和高性能使其成為處理非結構化數據的理想選擇,結合 Python 的強大功能,可以開發出高效的數據處理應用程序。在實際項目中,你可以根據具體需求靈活運用這些操作,充分發揮 MongoDB 和 Python 的優勢。

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

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

相關文章

使用 Python-pptx 庫提取 PPTX 文件中的結構與文字

是的,使用 python-pptx 庫是提取 PPTX 文件中結構和文字的理想選擇,原因如下: 專門處理 PPTX 格式 python-pptx 是一個專門為處理 PPTX 文件(.pptx 格式)而設計的 Python 庫。 它可以讀取和操作 PPTX 文件的內部結構…

DeepSeek本地化部署

DeepSeek本地化部署 本教程為一鍵式部署,適合于mac、ubuntu、windows。【開源地址】 環境要求 nodejs > 18Python > 3.10.12 步驟一:安裝ollama客戶端 官網直接安裝,ollama官網。安裝完成后使用命令:ollama -h&#xf…

驅動開發系列34 - Linux Graphics Intel 動態顯存技術的實現

一:概述 動態顯存技術(Dynamic Video Memory Technology, DVMT)是一種由 Intel 提出的內存分配技術,主要用于整合顯卡(集成顯卡)系統中,以便動態地調整顯存大小,從而在不同的負載場景下優化內存使用和系統性能。 動態顯存技術的核心在于共享系統內存。集成顯卡沒有獨立…

DeepSeek 入駐 Cursor —— 表現能否超越 Claude?

DeepSeek 剛剛在 Cursor 平臺上線了它的兩款模型:DeepSeek V3 和 R1。目前,許多開發者(包括我們在內)主要依賴 Claude 3.5 Sonnet(最新版本 claude-3-5-sonnet-20241022)作為主要語言模型,因此我…

持久性HTTPVS.非持久性HTTP

1. HTTP協議基礎 HTTP(HyperText Transfer Protocol)是Web通信的核心協議,定義了客戶端(瀏覽器)與服務器之間傳輸數據的規則。 在HTTP/1.0及之前的版本中,默認使用非持久性連接,而HTTP/1.1及更…

大數據與大模型:數字時代的共生力量

引言:大數據與大模型的嶄新時代 在數字化浪潮洶涌澎湃的當下,大數據與大模型無疑是最為耀眼的兩顆明星 ,深刻地改變著我們的生活、工作和思維方式。大數據,作為信息時代的寶藏,蘊含著無盡的價值。從電商平臺的海量交易…

中間件-redis-(ubantu)

1、安裝依賴包 sudo apt-get update sudo apt-get install redis 一旦安裝完成,Redis 服務將會自動啟動。想要檢查服務的狀態,輸入下面的命令: rootvims:/etc/redis# sudo systemctl status redis-server ● redis-server.service - Adva…

網絡安全架構師怎么考 網絡安全 架構

安全通信網絡 隨著現代技術的不斷發展,等級保護對象通常通過網絡實現資源共享和數據交互,當大量的設備連成網絡后,網絡安全成了最為關注的問題。按照“一個中心,三重防御”的縱深防御思想,邊界外部通過廣域網或城域網…

[2025年最新]2024.3版本idea無法安裝插件問題解決

背景 隨著大模型的持續發展,特別年前年后deepseek的優異表現,編程過程中,需要解決ai來輔助編程,因此需要安裝一些大模型插件 問題描述 在線安裝插件的時候會遇到以下問題: 1.數據一直在加載,加載的很滿 2.點…

自動駕駛---如何打造一款屬于自己的自動駕駛系統

在筆者的專欄《自動駕駛Planning決策規劃》中,主要講解了行車的相關知識,從Routing,到Behavior Planning,再到Motion Planning,以及最后的Control,筆者都做了相關介紹,其中主要包括算法在量產上…

centos7 升級openssl并安裝python3

參考文章:https://www.cnblogs.com/chuanzhang053/p/17653635.html 卸載已有版本 yum remove -y openssl openssl-devel下載1.1版本 wget https://www.openssl.org/source/openssl-1.1.1v.tar.gztar -zxf openssl-1.1.1v.tar.gz 查看openssl.conf文件的目錄 fin…

【python】3_容器

目錄 一、列表 list 1.1基本語法 1.2 常用操作方法 1.3 列表的遍歷 二、元組 tuple 特點: 三、字符串 常用操作方法: 四、序列 操作方法:切片 五、元素 特點: 基本語法: 集合常用功能: 六、字…

三角拓撲聚合優化器TTAO-Transformer-BiLSTM多變量回歸預測(Maltab)

三角拓撲聚合優化器TTAO-Transformer-BiLSTM多變量回歸預測(Maltab) 完整代碼私信回復三角拓撲聚合優化器TTAO-Transformer-BiLSTM多變量回歸預測(Maltab) 一、引言 1、研究背景和意義 在現代數據科學領域,時間序列…

Jenkins+gitee 搭建自動化部署

Jenkinsgitee 搭建自動化部署 環境說明: 軟件版本備注CentOS8.5.2111JDK1.8.0_211Maven3.8.8git2.27.0Jenkins2.319最好選穩定版本,不然安裝插件有點麻煩 一、安裝Jenkins程序 1、到官網下載相應的版本war或者直接使用yum安裝 Jenkins官網下載 直接…

AI 編程開發插件codeium Windsurf(vscode、editor) 安裝

1、vscode中安裝: 2、vscode中使用 3、輸入注冊的賬號密碼,就可以使用。 4、或者直接下載editor 5、安裝editor 下一步,下一步,直到安裝成功,中間可以改下安裝位置,如果C盤空間不夠。 同樣提示注冊或者登錄…

【Mac排錯】ls: command not found 終端命令失效的解決辦法

【TroubleShooting on Mac】ls: command not found 終端命令失效的解決辦法 A Solution to Solve “Command not found” of Terminal on Mac 一直在使用心愛的MacBook Pro的Terminal,并且為她定制了不同的Profile。 這樣,看起來她可以在不同季節&…

502 Bad Gateway 錯誤詳解:從表現推測原因,逐步排查直至解決

502 Bad Gateway 錯誤通常意味著服務器之間的通信失敗,但導致的具體原因往往因場景而異。 場景一:高峰期頻繁出現 502 錯誤 1.1 現象 在流量高峰期間(如促銷活動、直播發布等),頁面訪問變慢甚至出現 502 錯誤&#…

河北某石油管廊自動化監測

1. 項目簡介 近年來,國家密集出臺油氣管道建設相關政策和規劃引導中國油氣管道加快建設,2017年,在《中長期油氣管網規劃》中對2025年和2030年油氣管道發展目標均作出了相應的規劃目標。另一方面,隨著油氣管道行業的發展&#xff…

問題:通過策略模式+工廠模式+模板方法模式實現ifelse優化

項目場景: 提示:這里簡述項目相關背景: 示例:商城系統有會員系統,不同會員有不同優惠程度,普通會員不優惠;黃金會員打8折;白金會員優惠50元,再打7折; 問題描…

深入 JVM 虛擬機:字符串常量池演變與 intern() 方法工作原理解析

?? 作者主頁: 有來技術 ?? 開源項目: youlai-mall ︱vue3-element-admin︱youlai-boot︱vue-uniapp-template ?? 倉庫主頁: GitCode︱ Gitee ︱ Github ?? 歡迎點贊 ?? 收藏 ?評論 ?? 如有錯誤敬請糾正! 前言 在 Java 開發中,字符串常量池(String Constant…