數據存儲:一文掌握存儲數據到MongoDB詳解

文章目錄

    • 一、環境準備
      • 1.1 安裝MongoDB
      • 1.2 安裝Python MongoDB驅動
    • 二、連接到MongoDB
      • 2.1 基本連接
      • 2.2 連接到MongoDB Atlas(云服務)
    • 三、基本CRUD操作
      • 3.1 創建(Create):插入數據
      • 3.2 讀取(Read):查詢數據
      • 3.3 更新(Update):修改數據
      • 3.4 刪除(Delete):刪除數據
      • 3.5 完整示例
    • 四、高級操作
      • 4.1 使用索引
      • 4.2 事務處理
      • 4.3 聚合管道
    • 五、使用MongoEngine進行ODM操作
      • 5.1 安裝MongoEngine
      • 5.2 定義文檔模型
      • 5.3 執行CRUD操作
    • 六、最佳實踐
    • 七、總結

MongoDB是一種流行的NoSQL數據庫,以其靈活的文檔模型和高可擴展性而聞名。Python提供了多種庫來與MongoDB進行交互,其中最常用的是pymongo和mongoengine。本文將詳細介紹如何使用Python將數據存儲到MongoDB,包括環境設置、基本操作(CRUD)、高級功能以及最佳實踐。

關于mongo的更多樣例請參考:MongoDB基礎和進階

一、環境準備

1.1 安裝MongoDB

首先,確保已經在系統中安裝并運行了MongoDB。可以從 MongoDB官方網站 下載并安裝適合你操作系統的版本。

1.2 安裝Python MongoDB驅動

使用pip安裝pymongo庫,這是Python中最常用的MongoDB驅動。

pip install pymongo

如果需要使用MongoDB的認證功能或其他高級特性,可以考慮安裝官方推薦的驅動:

pip install pymongo[srv]

二、連接到MongoDB

2.1 基本連接

以下是使用pymongo連接到MongoDB的基本示例:

from pymongo import MongoClient# 連接到本地MongoDB實例
client = MongoClient('mongodb://localhost:27017/')# 選擇數據庫,如果不存在則會在第一次寫入時創建
db = client['mydatabase']# 選擇集合(類似于表),如果不存在則會在第一次插入時創建
collection = db['mycollection']

2.2 連接到MongoDB Atlas(云服務)

如果使用MongoDB Atlas等云服務,連接字符串會包含用戶名和密碼:

from pymongo import MongoClient# 替換為你的連接字符串
uri = "mongodb+srv://<username>:<password>@cluster0.mongodb.net/mydatabase?retryWrites=true&w=majority"client = MongoClient(uri)
db = client['mydatabase']
collection = db['mycollection']

三、基本CRUD操作

3.1 創建(Create):插入數據

插入單條文檔

document = {"name": "張三","age": 28,"email": "zhangsan@example.com"
}insert_result = collection.insert_one(document)
print(f"插入文檔的ID: {insert_result.inserted_id}")

插入多條文檔

documents = [{"name": "李四", "age": 34, "email": "lisi@example.com"},{"name": "王五", "age": 23, "email": "wangwu@example.com"}
]insert_many_result = collection.insert_many(documents)
print(f"插入文檔的IDs: {insert_many_result.inserted_ids}")

3.2 讀取(Read):查詢數據

查詢所有文檔

results = collection.find()
for doc in results:print(doc)

條件查詢

query = {"age": {"$gt": 25}}
results = collection.find(query)
for doc in results:print(doc)

投影(選擇特定字段)

query = {"name": "張三"}
projection = {"_id": 0, "email": 1}
result = collection.find_one(query, projection)
print(result)

3.3 更新(Update):修改數據

更新單個文檔

query = {"name": "李四"}
new_values = {"$set": {"age": 35}}
update_result = collection.update_one(query, new_values)
print(f"匹配的文檔數: {update_result.matched_count}, 修改的文檔數: {update_result.modified_count}")

更新多個文檔

query = {"age": {"$lt": 30}}
new_values = {"$inc": {"age": 1}}
update_result = collection.update_many(query, new_values)
print(f"匹配的文檔數: {update_result.matched_count}, 修改的文檔數: {update_result.modified_count}")

3.4 刪除(Delete):刪除數據

刪除單個文檔

query = {"name": "王五"}
delete_result = collection.delete_one(query)
print(f"刪除的文檔數: {delete_result.deleted_count}")

刪除多個文檔

query = {"age": {"$gt": 30}}
delete_result = collection.delete_many(query)
print(f"刪除的文檔數: {delete_result.deleted_count}")

3.5 完整示例

from pymongo import MongoClientdef main():# 連接 MongoDBclient = MongoClient("mongodb://localhost:27017/")print("連接 MongoDB 成功")# 選擇數據庫和集合db = client["testdb"]collection = db["users"]print("數據庫和集合已選擇")try:# 插入單條數據data = {"name": "張三", "age": 25, "email": "zhangsan@example.com"}result = collection.insert_one(data)print(f"插入成功,文檔 ID: {result.inserted_id}")# 插入多條數據data = [{"name": "李四", "age": 30, "email": "lisi@example.com"},{"name": "王五", "age": 28, "email": "wangwu@example.com"}]result = collection.insert_many(data)print(f"插入成功,文檔 IDs: {result.inserted_ids}")# 查詢所有數據print("查詢所有數據:")results = collection.find()for result in results:print(result)# 條件查詢print("查詢 age 大于 25 的數據:")query = {"age": {"$gt": 25}}results = collection.find(query)for result in results:print(result)# 更新單條數據query = {"name": "張三"}new_values = {"$set": {"age": 26}}result = collection.update_one(query, new_values)print(f"更新成功,匹配文檔數: {result.matched_count}, 修改文檔數: {result.modified_count}")# 刪除單條數據query = {"name": "張三"}result = collection.delete_one(query)print(f"刪除成功,刪除文檔數: {result.deleted_count}")finally:# 關閉連接client.close()print("MongoDB 連接已關閉")if __name__ == "__main__":main()

運行上述代碼后,輸出如下:

連接 MongoDB 成功
數據庫和集合已選擇
插入成功,文檔 ID: 651f8b7e4b8e4e1f2c8e4f1a
插入成功,文檔 IDs: [651f8b7e4b8e4e1f2c8e4f1b, 651f8b7e4b8e4e1f2c8e4f1c]
查詢所有數據:
{'_id': ObjectId('651f8b7e4b8e4e1f2c8e4f1a'), 'name': '張三', 'age': 25, 'email': 'zhangsan@example.com'}
{'_id': ObjectId('651f8b7e4b8e4e1f2c8e4f1b'), 'name': '李四', 'age': 30, 'email': 'lisi@example.com'}
{'_id': ObjectId('651f8b7e4b8e4e1f2c8e4f1c'), 'name': '王五', 'age': 28, 'email': 'wangwu@example.com'}
查詢 age 大于 25 的數據:
{'_id': ObjectId('651f8b7e4b8e4e1f2c8e4f1b'), 'name': '李四', 'age': 30, 'email': 'lisi@example.com'}
{'_id': ObjectId('651f8b7e4b8e4e1f2c8e4f1c'), 'name': '王五', 'age': 28, 'email': 'wangwu@example.com'}
更新成功,匹配文檔數: 1, 修改文檔數: 1
刪除成功,刪除文檔數: 1
MongoDB 連接已關閉

四、高級操作

4.1 使用索引

索引可以提高查詢性能。以下是創建索引的示例:

# 創建單字段索引
collection.create_index("email", unique=True)# 創建復合索引
collection.create_index([("name", pymongo.ASCENDING), ("age", pymongo.DESCENDING)])

4.2 事務處理

MongoDB支持多文檔事務,適用于需要原子性的操作。

from pymongo import MongoClient
from pymongo.errors import ConnectionFailureclient = MongoClient('mongodb://localhost:27017/')
db = client['mydatabase']
collection = db['mycollection']with client.start_session() as session:with session.start_transaction():try:collection.insert_one({"name": "趙六", "age": 29}, session=session)collection.update_one({"name": "張三"}, {"$set": {"age": 28}}, session=session)except ConnectionFailure:session.abort_transaction()print("事務失敗,已回滾")

4.3 聚合管道

聚合管道用于數據處理和分析。

pipeline = [{"$match": {"age": {"$gt": 25}}},{"$group": {"_id": "$name", "total": {"$sum": 1}}},{"$sort": {"total": -1}}
]results = collection.aggregate(pipeline)
for doc in results:print(doc)

五、使用MongoEngine進行ODM操作

MongoEngine是一個基于MongoDB的對象文檔映射器(ODM),類似于Django ORM,適用于需要更高抽象層次的項目。

5.1 安裝MongoEngine

pip install mongoengine

5.2 定義文檔模型

from mongoengine import Document, StringField, IntField, connect# 連接到MongoDB
connect('mydatabase')class User(Document):name = StringField(required=True)age = IntField(required=True)email = StringField(unique=True)# 創建文檔
user = User(name="孫七", age=27, email="sunqi@example.com")
user.save()# 查詢文檔
user = User.objects(name="孫七").first()
print(user.email)

5.3 執行CRUD操作

# 更新
user.age = 28
user.save()# 刪除
user.delete()# 查詢所有
users = User.objects()
for u in users:print(u.name, u.age, u.email)

六、最佳實踐

?連接管理:使用連接池和上下文管理器來管理MongoDB連接,確保資源合理利用。

from pymongo import MongoClientwith MongoClient('mongodb://localhost:27017/') as client:db = client['mydatabase']# 執行操作

?索引優化:根據查詢需求創建合適的索引,避免全表掃描,提高查詢性能。

?數據驗證:使用MongoEngine等ODM框架進行數據驗證,確保數據一致性。

?安全性

  • 使用認證機制保護MongoDB實例。
  • 避免在代碼中硬編碼敏感信息,使用環境變量或配置文件管理憑證。
  • ?錯誤處理:捕獲并處理可能的異常(如使用pymongo.errors.PyMongoError ),確保應用的健壯性。

性能優化:對于大規模數據插入,可以使用 insert_many 的 ordered=False 參數來提高性能。

?合理使用事務:事務適用于需要原子性的多文檔操作,但不宜濫用,以免影響性能。

七、總結

使用Python存儲數據到MongoDB非常靈活且高效。通過pymongo庫,可以執行各種CRUD操作,并利用其豐富的功能滿足不同的需求。對于需要更高抽象層次的項目,MongoEngine提供了便捷的ODM支持。在實際應用中,結合最佳實踐,可以構建高性能、可維護的數據存儲解決方案。

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

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

相關文章

算法教程:島的最大面積

算法教程:島的最大面積 我們將首先討論問題和解決方案,然后使用可視化工具(上一篇博客中進行了介紹)來更好地理解搜索過程。 問題描述 我們將要演練的具體問題是問題 Leetcode:島嶼的最大面積。在 Leetcode 上找到的直接問題描述是: 給你一個 m x n 二進制矩陣網格。島…

Scrapy:隧道代理中移除 Proxy-Authorization 的原理解析

隧道代理中移除 Proxy-Authorization 的原理解析 背景 在 Scrapy 的 HTTP 下載處理中&#xff0c;當使用隧道代理&#xff08;TunnelingAgent&#xff09;時&#xff0c;會移除請求頭中的 Proxy-Authorization。這個操作看似簡單&#xff0c;但背后有著重要的安全考慮和技術原…

大中型虛擬化園區網絡設計

《大中型虛擬化園區網絡設計》屬于博主的“園區網”專欄&#xff0c;若想成為HCIE&#xff0c;對于園區網相關的知識需要非常了解&#xff0c;更多關于園區網的內容博主會更新在“園區網”專欄里&#xff0c;請持續關注&#xff01; 一.前言 華為云園區網絡解決方案(簡稱Cloud…

sklearn中的決策樹-分類樹:剪枝參數

剪枝參數 在不加限制的情況下&#xff0c;一棵決策樹會生長到衡量不純度的指標最優&#xff0c;或者沒有更多的特征可用為止。這樣的決策樹 往往會過擬合。為了讓決策樹有更好的泛化性&#xff0c;我們要對決策樹進行剪枝。剪枝策略對決策樹的影響巨大&#xff0c;正確的剪枝策…

幾個api

幾個api 原型鏈 可以閱讀此文 Function instanceof Object // true Object instanceof Function // true Object.prototype.isPrototypeOf(Function) // true Function.prototype.isPrototypeOf(Object) // true Object.__proto__ Function.prototype // true Function.pro…

【Azure 架構師學習筆記】- Azure Databricks (12) -- Medallion Architecture簡介

本文屬于【Azure 架構師學習筆記】系列。 本文屬于【Azure Databricks】系列。 接上文 【Azure 架構師學習筆記】- Azure Databricks (11) – UC搭建 前言 使用ADB 或者數據湖&#xff0c;基本上繞不開一個架構“Medallion”&#xff0c; 它使得數據管理更為簡單有效。ADB 通過…

Android手機部署DeepSeek

1.概述 android手機端部署deepseek一般需要安裝termux,ollama,deepseek三個大的步驟 原因分析&#xff1a;deepseek等大模型需要類似ollama的工具去運行。ollama有mac window和linux版本&#xff0c;無Android版本&#xff1b;termux是一個模擬linux環境的Android app&#x…

計算機科學技術領域的內卷現狀與應對措施分析

計算機科學技術領域的內卷現狀與應對措施分析 李升偉 整理 ### 計算機科學技術領域的內卷現狀與應對措施分析 #### 一、內卷現狀分析 1. **教育與升學內卷** 計算機科學與技術相關專業&#xff08;如計算機科學與技術、人工智能、大數據等&#xff09;已成為考研競爭最…

python-leetcode 45.二叉樹轉換為鏈表

題目&#xff1a; 給定二叉樹的根節點root,請將它展開為一個單鏈表&#xff1a; 展開后的單鏈表應該使用同樣的TreeNode,其中right子指針指向鏈表中的下一個節點&#xff0c;而左子指針始終為空 展開后的單鏈表應該與二叉樹先序遍歷順序相同 方法一&#xff1a;二叉樹的前序…

【leetcode hot 100 15】三數之和

一、兩數之和的擴展 class Solution {public List<List<Integer>> threeSum(int[] nums) {// 將得到的結果存入Set中&#xff0c;保證不重復Set<List<Integer>> set new HashSet<>();// 模擬兩數之和&#xff0c;作為第一個循環中的內容for(in…

設備健康管理系統在制造業的深度應用探索

引言 在制造業的數字化轉型浪潮中&#xff0c;設備健康管理系統正逐漸成為企業提升競爭力的關鍵利器。隨著工業 4.0 和智能制造概念的不斷深入&#xff0c;制造業對設備的高效、穩定運行提出了更高要求。設備健康管理系統借助先進的傳感器技術、物聯網&#xff08;IoT&#xf…

HTTPS 與 HTTP 的區別在哪?

HTTP與HTTPS作為互聯網數據傳輸的核心協議&#xff0c;其通信機制與安全特性深刻影響著現代網絡應用的可靠性與用戶體驗。本文將解析兩者的通信流程、安全機制及核心差異。 一、HTTP的通信機制 先來看看HTTP是什么吧。 HTTP基于TCP/IP協議棧&#xff0c;采用經典客戶端-服務…

為什么要將PDF轉換為CSV?CSV是Excel嗎?

在企業和數據管理的日常工作中&#xff0c;PDF文件和CSV文件承擔著各自的任務。PDF通常用于傳輸和展示靜態的文檔&#xff0c;而CSV因其簡潔、易操作的特性&#xff0c;廣泛應用于數據存儲和交換。如果需要從PDF中提取、分析或處理數據&#xff0c;轉換為CSV格式可能是一個高效…

【JAVAEE】多線程

【JAVAEE】多線程 一、進程1.1 進程的定義1.2 進程和線程的聯系 二、線程2.1 JConsole工具2.2 創建線程2.2.1 Thread類&#xff0c;start&#xff08;&#xff09;&#xff0c;run&#xff08;&#xff09;2.2.2 繼承Thread類2.2.3 實現Runnable接口2.2.4 匿名內部類2.2.5 使用…

手機打電話時如何識別對方按下的DTMF按鍵的字符-安卓AI電話機器人

手機打電話時如何識別對方按下的DTMF按鍵的字符 --安卓AI電話機器人 一、前言 前面的篇章中&#xff0c;使用藍牙電話攔截手機通話的聲音&#xff0c;并對數據加工&#xff0c;這個功能出來也有一段時間了。前段時間有試用的用戶咨詢說&#xff1a;有沒有辦法在手機上&#xff…

【Go】十八、http 調用服務的編寫

http接口框架的搭建 這個http接口框架的搭建參考之前的全量搭建&#xff0c;這里是快速搭建的模式&#xff1a; 直接對已有的http模塊進行復制修改&#xff0c;主要修改點在于 proto部分與api、router 部分&#xff0c;剩余的要針對進行修改模塊名稱。 接口的具體編寫 在 a…

WiseFlow本地搭建實錄---保姆教程

今天從零開始搭建了Wiseflow的本地環境搭建&#xff0c;目前使用的都是免費的API&#xff0c;我建議大家可以一起嘗試一下搭建自己的關鍵信息的數據庫&#xff0c;我是windows的環境&#xff0c;但是其他的應該也差不多&#xff0c;踩了很多坑&#xff0c;希望這篇文章能幫大家…

數的計算(藍橋云課)

題目描述 輸入一個自然數 n (n≤1000)n (n≤1000)&#xff0c;我們對此自然數按照如下方法進行處理: 不作任何處理; 在它的左邊加上一個自然數,但該自然數不能超過原數的一半; 加上數后,繼續按此規則進行處理,直到不能再加自然數為止。 問總共可以產生多少個數。 輸入描述 輸…

知識庫功能測試難點

圖表交互功能測試難點 知識庫圖表類型多&#xff0c;每種圖表交互功能不同。像柱狀圖&#xff0c;可能有點擊柱子查看詳細數據、鼠標懸停顯示數據提示等交互&#xff1b;折線圖除了這些&#xff0c;還可能支持縮放查看不同時間段數據。多種交互操作在不同圖表間存在差異&#x…

【人工智能】數據挖掘與應用題庫(201-300)

1、在LetNet5網絡中,卷積核的大小是? 答案:5*5 2、LeNet5網絡參數的數量約為? 答案:6萬 3、AlexNet與LeNet5相比,使用了哪些機制來改進模型的訓練過程? 答案: 數據增廣Dropout抑制過擬合ReLU激活函數CUDA加速神經網絡訓練4、VGGNet使用的卷積核的大小是? 答案:…