MongoDB是一种流行的NoSQL数据库,它使用类似JSON的BSON格式存储数据。与传统的关系型数据库不同,MongoDB具有更好的灵活性和扩展性。本文将详细介绍如何使用Python连接和操作MongoDB数据库。
Python需要通过MongoDB驱动来连接数据库,最常用的就是PyMongo。
使用pip安装PyMongo:
pip install pymongo如果需要安装特定版本:
pip install pymongo==4.3.3升级到最新版本:
pip install --upgrade pymongo安装完成后,可以创建一个测试文件来验证安装是否成功:
import pymongo
print("PyMongo安装成功!")如果运行没有报错,说明PyMongo已经正确安装。
在开始操作之前,需要先连接到MongoDB数据库:
import pymongo
# 连接到本地MongoDB服务
client = pymongo.MongoClient("mongodb://localhost:27017/")
# 或者使用简写形式
client = pymongo.MongoClient("localhost", 27017)如果MongoDB设置了用户名和密码,需要这样连接:
client = pymongo.MongoClient("mongodb://username:password@localhost:27017/")创建数据库非常简单:
# 创建或选择数据库
db = client["mydatabase"]
# 或者
db = client.mydatabase重要说明:在MongoDB中,数据库只有在插入数据后才会真正创建。仅仅声明数据库名称是不会创建数据库的。
检查数据库是否存在:
# 获取所有数据库名称
db_list = client.list_database_names()
# 检查数据库是否存在
if "mydatabase" in db_list:
print("数据库存在")
else:
print("数据库不存在")集合相当于关系型数据库中的表:
# 创建或选择集合
collection = db["mycollection"]
# 或者
collection = db.mycollection同样,集合也只有在插入数据后才会真正创建。
检查集合是否存在:
# 获取所有集合名称
collection_list = db.list_collection_names()
if "mycollection" in collection_list:
print("集合存在")
else:
print("集合不存在")插入文档
文档相当于关系型数据库中的行记录:
# 插入单个文档
document = {
"name": "张三",
"age": 25,
"city": "北京",
"hobbies": ["阅读", "游泳", "编程"]
}
result = collection.insert_one(document)
print("插入的文档ID:", result.inserted_id)
# 插入多个文档
documents = [
{"name": "李四", "age": 30, "city": "上海"},
{"name": "王五", "age": 28, "city": "广州"},
{"name": "赵六", "age": 35, "city": "深圳"}
]
result = collection.insert_many(documents)
print("插入的文档IDs:", result.inserted_ids)查询文档
查询是数据库操作中最常用的功能:
# 查询第一个文档
first_doc = collection.find_one()
print("第一个文档:", first_doc)
# 查询所有文档
print("所有文档:")
for doc in collection.find():
print(doc)
# 条件查询
print("年龄大于28的用户:")
for doc in collection.find({"age": {"$gt": 28}}):
print(doc)
# 查询特定字段
print("只显示姓名和城市:")
for doc in collection.find({}, {"name": 1, "city": 1}):
print(doc)常用查询操作符:
$eq:等于
$gt:大于
$lt:小于
$gte:大于等于
$lte:小于等于
$in:在数组中
$and:与操作
$or:或操作
更新文档
更新现有文档:
# 更新单个文档
result = collection.update_one(
{"name": "张三"},
{"$set": {"age": 26, "city": "杭州"}}
)
print("修改的文档数:", result.modified_count)
# 更新多个文档
result = collection.update_many(
{"age": {"$lt": 30}},
{"$set": {"status": "青年"}}
)
print("修改的文档数:", result.modified_count)
# 替换整个文档
result = collection.replace_one(
{"name": "李四"},
{"name": "李四", "age": 31, "city": "南京", "job": "工程师"}
)删除文档
删除不需要的文档:
# 删除单个文档
result = collection.delete_one({"name": "王五"})
print("删除的文档数:", result.deleted_count)
# 删除多个文档
result = collection.delete_many({"age": {"$gt": 30}})
print("删除的文档数:", result.deleted_count)
# 删除所有文档
result = collection.delete_many({})
print("删除的文档数:", result.deleted_count)排序查询结果:
# 按年龄升序排列
for doc in collection.find().sort("age"):
print(doc)
# 按年龄降序排列
for doc in collection.find().sort("age", -1):
print(doc)限制返回结果数量:
# 只返回前2个结果
for doc in collection.find().limit(2):
print(doc)复杂条件查询:
# 多个条件组合查询
query = {
"$and": [
{"age": {"$gte": 25}},
{"age": {"$lte": 35}},
{"city": {"$in": ["北京", "上海"]}}
]
}
for doc in collection.find(query):
print(doc)索引操作
创建索引可以提高查询速度:
# 创建单字段索引
collection.create_index("name")
# 创建复合索引
collection.create_index([("name", 1), ("age", -1)])
# 获取所有索引
indexes = collection.list_indexes()
for index in indexes:
print(index)下面是一个完整的用户管理系统示例:
import pymongo
from datetime import datetime
class UserManager:
def __init__(self):
self.client = pymongo.MongoClient("localhost", 27017)
self.db = self.client["user_management"]
self.users = self.db["users"]
# 创建索引
self.users.create_index("email", unique=True)
def add_user(self, name, email, age, city):
try:
user_data = {
"name": name,
"email": email,
"age": age,
"city": city,
"created_at": datetime.now()
}
result = self.users.insert_one(user_data)
print(f"用户 {name} 添加成功,ID: {result.inserted_id}")
return True
except pymongo.errors.DuplicateKeyError:
print("错误:邮箱已存在")
return False
def find_user_by_email(self, email):
return self.users.find_one({"email": email})
def find_users_by_city(self, city):
return list(self.users.find({"city": city}))
def update_user_age(self, email, new_age):
result = self.users.update_one(
{"email": email},
{"$set": {"age": new_age, "updated_at": datetime.now()}}
)
return result.modified_count > 0
# 使用示例
if __name__ == "__main__":
manager = UserManager()
# 添加用户
manager.add_user("张三", "zhangsan@email.com", 25, "北京")
manager.add_user("李四", "lisi@email.com", 30, "上海")
# 查询用户
user = manager.find_user_by_email("zhangsan@email.com")
print("查询结果:", user)连接管理:在应用程序中重用数据库连接,不要频繁创建和关闭连接。
错误处理:始终对数据库操作进行错误处理:
try:
result = collection.insert_one(document)
except pymongo.errors.DuplicateKeyError:
print("重复键错误")
except pymongo.errors.ConnectionFailure:
print("连接失败")使用项目:只查询需要的字段,提高查询效率。
批量操作:大量数据操作时使用批量方法,减少网络开销。
索引优化:为经常查询的字段创建索引。
通过PyMongo,Python可以很方便地操作MongoDB数据库。从基本的增删改查到高级的索引和聚合操作,PyMongo提供了完整的api支持。掌握这些技能后,你就能够构建强大的数据驱动应用程序。
对于想深入学习MongoDB的读者,建议参考fly63教程中的MongoDB高级主题,包括聚合管道、事务处理、性能优化等内容。记住,实践是最好的学习方式,多动手编写代码,逐步掌握MongoDB的各种特性。
本文内容仅供个人学习/研究/参考使用,不构成任何决策建议或专业指导。分享/转载时请标明原文来源,同时请勿将内容用于商业售卖、虚假宣传等非学习用途哦~感谢您的理解与支持!