Python使用pymongo库连接MongoDB数据库
安装pymongo库
在使用 pymongo
库连接 MongoDB
数据库之前,首先要确保该库已安装在你的Python环境中。如果使用的是 pip
包管理器,在命令行中输入以下命令即可完成安装:
pip install pymongo
如果你使用的是 conda
,那么可以使用以下命令:
conda install -c anaconda pymongo
安装完成后,就可以在Python代码中导入 pymongo
库来使用它提供的功能。
基本连接
连接本地MongoDB
在大多数情况下,MongoDB
数据库运行在本地主机上,默认端口为 27017
。要连接到本地的 MongoDB
实例,使用 pymongo
库的 MongoClient
类即可。示例代码如下:
import pymongo
# 创建MongoClient实例,连接本地MongoDB
client = pymongo.MongoClient()
# 或者显式指定主机和端口
# client = pymongo.MongoClient('localhost', 27017)
# 获取数据库对象
db = client['test_database']
# 获取集合对象
collection = db['test_collection']
在上述代码中,首先通过 pymongo.MongoClient()
创建了一个连接到本地 MongoDB
实例的客户端对象。如果 MongoDB
使用默认设置,这样就可以成功连接。然后通过客户端对象获取数据库对象 test_database
,再从数据库对象中获取集合对象 test_collection
。这里的 test_database
和 test_collection
只是示例名称,你可以根据实际情况替换为真实的数据库和集合名称。
连接远程MongoDB
若要连接远程的 MongoDB
实例,同样使用 MongoClient
类,但需要指定远程主机的地址和端口。示例代码如下:
import pymongo
# 假设远程主机地址为192.168.1.100,端口为27017
client = pymongo.MongoClient('192.168.1.100', 27017)
# 获取数据库对象
db = client['remote_database']
# 获取集合对象
collection = db['remote_collection']
如果远程 MongoDB
实例启用了身份验证,还需要在连接字符串中添加用户名和密码信息。例如:
import pymongo
uri = "mongodb://username:password@192.168.1.100:27017/"
client = pymongo.MongoClient(uri)
# 获取数据库对象
db = client['remote_database']
# 获取集合对象
collection = db['remote_collection']
上述代码中,通过构建包含用户名和密码的连接字符串 uri
,再使用该字符串创建 MongoClient
实例,从而实现连接需要身份验证的远程 MongoDB
实例。
数据库操作
创建数据库
在 MongoDB
中,数据库在插入数据时才会真正创建(如果不存在)。使用 pymongo
时,通过 MongoClient
获取数据库对象时,如果数据库不存在,不会立即创建,直到有数据插入。例如:
import pymongo
client = pymongo.MongoClient()
# 获取数据库对象,这里的new_database此时并未真正创建
db = client['new_database']
# 插入一条数据,此时new_database会被创建
document = {'name': 'example'}
collection = db['new_collection']
collection.insert_one(document)
上述代码中,首先获取了一个名为 new_database
的数据库对象,但此时数据库并未真正创建。当向该数据库下的集合 new_collection
插入一条数据时,new_database
数据库以及 new_collection
集合才会被创建。
列出所有数据库
可以使用 list_database_names()
方法列出当前 MongoDB
实例中的所有数据库名称。示例代码如下:
import pymongo
client = pymongo.MongoClient()
database_names = client.list_database_names()
print(database_names)
运行上述代码,会输出当前 MongoDB
实例中所有数据库的名称列表。
删除数据库
要删除一个数据库,使用 drop_database()
方法。示例代码如下:
import pymongo
client = pymongo.MongoClient()
# 删除名为to_delete_database的数据库
client.drop_database('to_delete_database')
上述代码会删除名为 to_delete_database
的数据库。请谨慎操作,因为数据库一旦删除,其中所有的数据和集合都将无法恢复。
集合操作
创建集合
与数据库类似,集合在插入数据时才会真正创建(如果不存在)。通过数据库对象获取集合对象时,如果集合不存在,不会立即创建。例如:
import pymongo
client = pymongo.MongoClient()
db = client['test_db']
# 获取集合对象,这里的new_collection此时并未真正创建
collection = db['new_collection']
# 插入一条数据,此时new_collection会被创建
document = {'key': 'value'}
collection.insert_one(document)
上述代码中,先获取了一个名为 new_collection
的集合对象,当向该集合插入数据时,new_collection
集合才会被创建。
列出所有集合
使用数据库对象的 list_collection_names()
方法可以列出当前数据库中的所有集合名称。示例代码如下:
import pymongo
client = pymongo.MongoClient()
db = client['test_db']
collection_names = db.list_collection_names()
print(collection_names)
运行上述代码,会输出当前数据库 test_db
中所有集合的名称列表。
删除集合
要删除一个集合,使用集合对象的 drop()
方法。示例代码如下:
import pymongo
client = pymongo.MongoClient()
db = client['test_db']
collection = db['to_delete_collection']
# 删除名为to_delete_collection的集合
collection.drop()
上述代码会删除名为 to_delete_collection
的集合。同样,删除操作需谨慎,因为集合删除后其中的数据将无法恢复。
文档操作
插入单个文档
使用集合对象的 insert_one()
方法可以插入单个文档。文档在 MongoDB
中以 BSON
(Binary JSON)格式存储,在Python中通常用字典来表示。示例代码如下:
import pymongo
client = pymongo.MongoClient()
db = client['test_db']
collection = db['test_collection']
document = {
'name': 'John',
'age': 30,
'city': 'New York'
}
result = collection.insert_one(document)
print('Inserted document ID:', result.inserted_id)
上述代码中,定义了一个文档 document
,它是一个Python字典。然后使用 insert_one()
方法将该文档插入到 test_collection
集合中。insert_one()
方法返回一个 InsertOneResult
对象,通过该对象的 inserted_id
属性可以获取插入文档的唯一标识符。
插入多个文档
使用集合对象的 insert_many()
方法可以插入多个文档。示例代码如下:
import pymongo
client = pymongo.MongoClient()
db = client['test_db']
collection = db['test_collection']
documents = [
{
'name': 'Jane',
'age': 25,
'city': 'Los Angeles'
},
{
'name': 'Bob',
'age': 35,
'city': 'Chicago'
}
]
result = collection.insert_many(documents)
print('Inserted document IDs:', result.inserted_ids)
在上述代码中,定义了一个包含两个文档的列表 documents
,然后使用 insert_many()
方法将这些文档插入到 test_collection
集合中。insert_many()
方法返回一个 InsertManyResult
对象,通过该对象的 inserted_ids
属性可以获取插入的多个文档的唯一标识符列表。
查询单个文档
使用集合对象的 find_one()
方法可以查询符合条件的单个文档。例如,查询 age
为 30
的文档:
import pymongo
client = pymongo.MongoClient()
db = client['test_db']
collection = db['test_collection']
query = {'age': 30}
result = collection.find_one(query)
print(result)
上述代码中,定义了查询条件 query
,它是一个字典,表示查询 age
字段值为 30
的文档。find_one()
方法返回符合条件的第一个文档,如果没有找到则返回 None
。
查询多个文档
使用集合对象的 find()
方法可以查询符合条件的多个文档。find()
方法返回一个游标对象,通过迭代游标可以获取所有符合条件的文档。例如,查询 age
大于 25
的所有文档:
import pymongo
client = pymongo.MongoClient()
db = client['test_db']
collection = db['test_collection']
query = {'age': {'$gt': 25}}
cursor = collection.find(query)
for document in cursor:
print(document)
在上述代码中,定义了查询条件 query
,其中 $gt
是 MongoDB
的查询操作符,表示“大于”。find()
方法返回一个游标对象 cursor
,通过迭代 cursor
可以打印出所有符合条件的文档。
更新单个文档
使用集合对象的 update_one()
方法可以更新符合条件的单个文档。例如,将 name
为 John
的文档的 age
字段更新为 31
:
import pymongo
client = pymongo.MongoClient()
db = client['test_db']
collection = db['test_collection']
filter_query = {'name': 'John'}
update = {'$set': {'age': 31}}
result = collection.update_one(filter_query, update)
print('Matched count:', result.matched_count)
print('Modified count:', result.modified_count)
上述代码中,filter_query
是过滤条件,用于指定要更新的文档。update
是更新操作,$set
操作符表示设置字段的值。update_one()
方法返回一个 UpdateResult
对象,通过该对象的 matched_count
属性可以获取匹配到的文档数量,modified_count
属性可以获取实际被修改的文档数量。
更新多个文档
使用集合对象的 update_many()
方法可以更新符合条件的多个文档。例如,将 city
为 New York
的所有文档的 age
字段增加 1
:
import pymongo
client = pymongo.MongoClient()
db = client['test_db']
collection = db['test_collection']
filter_query = {'city': 'New York'}
update = {'$inc': {'age': 1}}
result = collection.update_many(filter_query, update)
print('Matched count:', result.matched_count)
print('Modified count:', result.modified_count)
在上述代码中,filter_query
是过滤条件,update
中的 $inc
操作符表示增加字段的值。update_many()
方法返回的 UpdateResult
对象同样可以获取匹配和修改的文档数量。
删除单个文档
使用集合对象的 delete_one()
方法可以删除符合条件的单个文档。例如,删除 name
为 Bob
的文档:
import pymongo
client = pymongo.MongoClient()
db = client['test_db']
collection = db['test_collection']
filter_query = {'name': 'Bob'}
result = collection.delete_one(filter_query)
print('Deleted count:', result.deleted_count)
上述代码中,filter_query
是删除条件,delete_one()
方法返回一个 DeleteResult
对象,通过其 deleted_count
属性可以获取被删除的文档数量(通常为 0
或 1
)。
删除多个文档
使用集合对象的 delete_many()
方法可以删除符合条件的多个文档。例如,删除 city
为 Los Angeles
的所有文档:
import pymongo
client = pymongo.MongoClient()
db = client['test_db']
collection = db['test_collection']
filter_query = {'city': 'Los Angeles'}
result = collection.delete_many(filter_query)
print('Deleted count:', result.deleted_count)
在上述代码中,filter_query
是删除条件,delete_many()
方法返回的 DeleteResult
对象的 deleted_count
属性可以获取被删除的文档数量。
索引操作
创建索引
在 MongoDB
中,索引可以提高查询性能。使用集合对象的 create_index()
方法可以创建索引。例如,为 test_collection
集合的 name
字段创建一个升序索引:
import pymongo
client = pymongo.MongoClient()
db = client['test_db']
collection = db['test_collection']
index_name = collection.create_index([('name', pymongo.ASCENDING)])
print('Created index:', index_name)
上述代码中,create_index()
方法的参数是一个包含字段名和排序方向的列表。pymongo.ASCENDING
表示升序,pymongo.DESCENDING
表示降序。该方法返回创建的索引名称。
创建复合索引
复合索引是基于多个字段的索引。例如,为 test_collection
集合的 age
和 city
字段创建一个复合索引:
import pymongo
client = pymongo.MongoClient()
db = client['test_db']
collection = db['test_collection']
index_name = collection.create_index([('age', pymongo.ASCENDING), ('city', pymongo.DESCENDING)])
print('Created index:', index_name)
在上述代码中,通过传递一个包含两个字段及其排序方向的列表,创建了一个复合索引。
列出所有索引
使用集合对象的 list_indexes()
方法可以列出当前集合的所有索引。示例代码如下:
import pymongo
client = pymongo.MongoClient()
db = client['test_db']
collection = db['test_collection']
indexes = collection.list_indexes()
for index in indexes:
print(index)
运行上述代码,会打印出当前集合的所有索引信息,包括索引名称、字段等。
删除索引
使用集合对象的 drop_index()
方法可以删除指定名称的索引。例如,删除名为 name_1
的索引:
import pymongo
client = pymongo.MongoClient()
db = client['test_db']
collection = db['test_collection']
collection.drop_index('name_1')
print('Index dropped')
上述代码会删除名为 name_1
的索引。注意要确保索引名称正确,否则可能会操作失败。
高级查询
使用逻辑操作符
在 MongoDB
中,可以使用逻辑操作符如 $and
、$or
等进行更复杂的查询。例如,查询 age
大于 25
且 city
为 New York
的文档:
import pymongo
client = pymongo.MongoClient()
db = client['test_db']
collection = db['test_collection']
query = {
'$and': [
{'age': {'$gt': 25}},
{'city': 'New York'}
]
}
cursor = collection.find(query)
for document in cursor:
print(document)
上述代码中,使用 $and
操作符将两个查询条件组合起来。只有同时满足这两个条件的文档才会被查询出来。
使用正则表达式
MongoDB
支持使用正则表达式进行文本查询。例如,查询 name
字段以 J
开头的文档:
import pymongo
import re
client = pymongo.MongoClient()
db = client['test_db']
collection = db['test_collection']
pattern = re.compile('^J')
query = {'name': pattern}
cursor = collection.find(query)
for document in cursor:
print(document)
在上述代码中,使用 re.compile()
创建了一个正则表达式对象 pattern
,表示以 J
开头。然后将该正则表达式对象作为查询条件,查询符合条件的文档。
使用聚合操作
聚合操作可以对文档进行复杂的数据分析和处理。pymongo
库中使用集合对象的 aggregate()
方法来进行聚合操作。例如,统计 test_collection
集合中每个城市的人数:
import pymongo
client = pymongo.MongoClient()
db = client['test_db']
collection = db['test_collection']
pipeline = [
{'$group': {'_id': '$city', 'count': {'$sum': 1}}}
]
result = collection.aggregate(pipeline)
for document in result:
print(document)
上述代码中,定义了一个聚合管道 pipeline
。$group
操作符用于按 city
字段分组,并使用 $sum
操作符统计每个组中的文档数量。aggregate()
方法返回一个游标对象,通过迭代游标可以获取聚合结果。
错误处理
在使用 pymongo
连接和操作 MongoDB
数据库时,可能会遇到各种错误。例如,连接失败、数据库操作错误等。为了确保程序的健壮性,需要进行适当的错误处理。以下是一些常见错误及其处理方式的示例:
import pymongo
try:
client = pymongo.MongoClient('localhost', 27017)
db = client['test_db']
collection = db['test_collection']
document = {'name': 'Error Test'}
result = collection.insert_one(document)
except pymongo.errors.ConnectionFailure as e:
print('Connection failed:', e)
except pymongo.errors.OperationFailure as e:
print('Operation failed:', e)
在上述代码中,使用 try - except
块捕获可能出现的错误。pymongo.errors.ConnectionFailure
用于捕获连接失败的错误,pymongo.errors.OperationFailure
用于捕获数据库操作失败的错误。根据不同的错误类型,可以进行相应的处理,如打印错误信息、进行重试等操作。
通过以上详细的介绍,你应该对使用 pymongo
库连接和操作 MongoDB
数据库有了较为深入的了解。从基本连接到各种数据库、集合和文档操作,再到高级查询、索引操作以及错误处理,这些知识将帮助你在Python开发中有效地使用 MongoDB
数据库。在实际应用中,你可以根据具体需求灵活运用这些技术,构建出高效、可靠的数据驱动应用程序。同时,要注意根据实际情况进行性能优化,合理使用索引等技术,以提高数据库操作的效率。