MK
摩柯社区 - 一个极简的技术知识社区
AI 面试

Python使用pymongo库连接MongoDB数据库

2023-07-196.2k 阅读

安装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_databasetest_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() 方法可以查询符合条件的单个文档。例如,查询 age30 的文档:

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,其中 $gtMongoDB 的查询操作符,表示“大于”。find() 方法返回一个游标对象 cursor,通过迭代 cursor 可以打印出所有符合条件的文档。

更新单个文档

使用集合对象的 update_one() 方法可以更新符合条件的单个文档。例如,将 nameJohn 的文档的 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() 方法可以更新符合条件的多个文档。例如,将 cityNew 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() 方法可以删除符合条件的单个文档。例如,删除 nameBob 的文档:

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 属性可以获取被删除的文档数量(通常为 01)。

删除多个文档

使用集合对象的 delete_many() 方法可以删除符合条件的多个文档。例如,删除 cityLos 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 集合的 agecity 字段创建一个复合索引:

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 大于 25cityNew 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 数据库。在实际应用中,你可以根据具体需求灵活运用这些技术,构建出高效、可靠的数据驱动应用程序。同时,要注意根据实际情况进行性能优化,合理使用索引等技术,以提高数据库操作的效率。