# Python操作MongoDB的示例分析
## 一、MongoDB簡介與核心概念
### 1.1 NoSQL數據庫概述
NoSQL(Not Only SQL)數據庫是傳統關系型數據庫的重要補充,主要特點包括:
- 非關系型數據模型
- 靈活的數據結構(Schema-less)
- 水平可擴展性
- 高性能讀寫能力
根據數據模型的不同,NoSQL數據庫主要分為四類:
1. 鍵值存儲(如Redis)
2. 文檔存儲(如MongoDB)
3. 列族存儲(如Cassandra)
4. 圖數據庫(如Neo4j)
### 1.2 MongoDB核心特性
MongoDB作為領先的文檔型數據庫,具有以下顯著特點:
**文檔數據模型**
- 數據以BSON(Binary JSON)格式存儲
- 支持嵌套文檔和數組
- 動態模式允許字段自由變化
**分布式架構**
- 分片(Sharding)實現水平擴展
- 副本集(Replica Set)保障高可用
- 支持多數據中心部署
**查詢能力**
- 豐富的查詢運算符
- 聚合管道框架
- 全文檢索支持
**事務支持**
- 自4.0版本起支持多文檔ACID事務
- 跨分片事務支持
## 二、環境準備與基本連接
### 2.1 安裝與配置
```bash
# 安裝MongoDB社區版(以Ubuntu為例)
sudo apt-get install mongodb
# 安裝Python驅動
pip install pymongo
# 可選:安裝MongoDB Compass(圖形化管理工具)
from pymongo import MongoClient
from pymongo.errors import ConnectionFailure
# 基本連接
client = MongoClient('mongodb://localhost:27017/')
# 帶認證的連接
auth_client = MongoClient(
'mongodb://username:password@localhost:27017/dbname?authSource=admin'
)
# 連接驗證
try:
client.admin.command('ping')
print("Successfully connected to MongoDB")
except ConnectionFailure as e:
print(f"Connection failed: {e}")
# 獲取/創建數據庫(懶加載方式)
db = client['example_database']
# 獲取集合
collection = db['users']
# 列出所有集合
print(db.list_collection_names())
# 刪除集合
db['temp_collection'].drop()
# 插入單條文檔
user1 = {
"name": "Alice",
"age": 28,
"email": "alice@example.com",
"hobbies": ["reading", "hiking"]
}
insert_result = collection.insert_one(user1)
print(f"Inserted ID: {insert_result.inserted_id}")
# 批量插入
users = [
{"name": "Bob", "age": 32, "status": "active"},
{"name": "Charlie", "age": 25, "status": "inactive"}
]
result = collection.insert_many(users)
print(f"Inserted IDs: {result.inserted_ids}")
# 基礎查詢
print("All documents:")
for doc in collection.find():
print(doc)
# 條件查詢
print("Users over 30:")
for user in collection.find({"age": {"$gt": 30}}):
print(user)
# 投影查詢(指定返回字段)
print("Names only:")
for user in collection.find({}, {"name": 1, "_id": 0}):
print(user)
# 復雜查詢示例
query = {
"$and": [
{"age": {"$gte": 25}},
{"status": "active"},
{"hobbies": {"$in": ["hiking"]}}
]
}
print("Complex query results:")
for user in collection.find(query):
print(user)
# 更新單文檔
update_result = collection.update_one(
{"name": "Alice"},
{"$set": {"age": 29, "last_modified": datetime.datetime.utcnow()}}
)
print(f"Matched {update_result.matched_count}, modified {update_result.modified_count}")
# 更新多文檔
update_many_result = collection.update_many(
{"status": "inactive"},
{"$set": {"status": "active"}}
)
# 數組操作
collection.update_one(
{"name": "Alice"},
{"$push": {"hobbies": "swimming"}}
)
# 使用運算符
collection.update_one(
{"name": "Bob"},
{"$inc": {"age": 1}, "$currentDate": {"lastModified": True}}
)
# 刪除單文檔
delete_result = collection.delete_one({"name": "Charlie"})
print(f"Deleted {delete_result.deleted_count} document")
# 刪除多文檔
delete_many_result = collection.delete_many({"status": "inactive"})
# 刪除所有文檔(保留集合)
collection.delete_many({})
pipeline = [
{"$match": {"status": "active"}},
{"$group": {
"_id": "$age_group",
"count": {"$sum": 1},
"average_age": {"$avg": "$age"}
}},
{"$sort": {"count": -1}},
{"$limit": 5}
]
results = collection.aggregate(pipeline)
for result in results:
print(result)
# 創建索引
collection.create_index([("name", pymongo.ASCENDING)], unique=True)
collection.create_index([("age", pymongo.ASCENDING), ("status", pymongo.ASCENDING)])
# 查看索引
print(collection.index_information())
# 文本索引
collection.create_index([("bio", "text")])
# 執行文本搜索
results = collection.find({"$text": {"$search": "software engineer"}})
from pymongo import InsertOne, UpdateOne, DeleteOne
requests = [
InsertOne({"name": "David", "age": 40}),
UpdateOne({"name": "Alice"}, {"$set": {"age": 30}}),
DeleteOne({"name": "Bob"})
]
result = collection.bulk_write(requests)
print(f"Bulk write results: {result.bulk_api_result}")
# 日志文檔結構示例
log_entry = {
"user_id": "u12345",
"action": "view_product",
"product_id": "p67890",
"timestamp": datetime.datetime.utcnow(),
"metadata": {
"ip_address": "192.168.1.1",
"user_agent": "Mozilla/5.0"
}
}
# 時間序列集合(MongoDB 5.0+)
db.create_collection(
"user_logs",
timeseries={
"timeField": "timestamp",
"metaField": "metadata",
"granularity": "hours"
}
)
# 高效查詢最近日志
recent_logs = db.user_logs.find({
"timestamp": {"$gte": datetime.datetime.now() - datetime.timedelta(days=1)}
}).sort("timestamp", -1).limit(100)
# 產品文檔結構
product = {
"sku": "PROD-1001",
"name": "Wireless Headphones",
"price": 99.99,
"stock": 50,
"attributes": {
"brand": "Sony",
"color": "black",
"wireless": True
},
"categories": ["electronics", "audio"],
"reviews": [
{"user": "customer1", "rating": 5, "comment": "Excellent sound quality"},
{"user": "customer2", "rating": 4, "comment": "Comfortable fit"}
]
}
# 多條件搜索
search_results = db.products.find({
"price": {"$lte": 100},
"attributes.wireless": True,
"categories": "electronics",
"reviews.rating": {"$gte": 4}
})
始終啟用訪問控制
# 在mongod.conf中配置
security:
authorization: enabled
使用角色基的訪問控制(RBAC)
加密敏感數據字段
定期審計數據庫活動
連接池管理:
client = MongoClient(
'mongodb://localhost:27017/',
maxPoolSize=50,
minPoolSize=10,
connectTimeoutMS=30000
)
查詢優化:
批量操作:
問題1:連接數過多 - 解決方案:調整連接池大小,使用連接復用
問題2:慢查詢
# 啟用分析器
db.set_profiling_level(1, slow_ms=100)
# 查看慢查詢日志
for record in db.system.profile.find().sort("ts", -1).limit(10):
print(record)
問題3:內存溢出 - 解決方案: 1. 添加更多RAM 2. 優化工作集大小 3. 使用分片集群分散負載
本文全面介紹了Python操作MongoDB的核心技術,包括: - 基礎CRUD操作 - 高級查詢與聚合 - 索引優化策略 - 實際應用場景實現
官方文檔:
進階主題:
性能調優:
通過掌握這些技術,開發者可以構建高性能、可擴展的現代應用程序,充分發揮MongoDB在靈活數據模型方面的優勢。 “`
這篇文章提供了從基礎到進階的完整MongoDB操作指南,包含: 1. 環境配置和連接管理 2. 詳細的CRUD操作示例 3. 高級查詢和聚合技術 4. 性能優化策略 5. 實際應用案例 6. 常見問題解決方案
全文約4500字,采用Markdown格式,包含代碼塊、列表和分級標題,適合作為技術文檔或教程使用。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。