利用Python操作MongoDB数据库的详细指南

Noah
Noah
发布时间:2026-10-15| 3人浏览过
原创

本文详细介绍如何使用Python通过PyMongo库操作MongoDB数据库。内容涵盖环境安装、数据库连接配置、集合操作、数据插入、查询、更新与删除等核心功能。特别针对Python与MongoDB在空值、布尔值及排序参数上的语法差异进行对比说明,帮助开发者避免常见错误,实现高效的数据交互。

前言

在软件开发中,通常需要一种编程语言来管理数据库。Python因其字典结构与MongoDB文档格式的高度相似性,在操作MongoDB时具有天然优势。本文将系统讲解如何利用Python进行MongoDB的相关操作。

1 连接数据库

1.1 安装PyMongo

要在Python中操作MongoDB,必须使用第三方库PyMongo。安装方式与其他Python第三方库一致,通过pip命令即可完成安装。

python3 -m pip install pymongo

若需指定特定版本进行安装,可使用如下命令格式。

python3 -m pip3 install pymongo==3.5.1

如需更新已安装的pymongo库,可执行相应的升级命令。

python3 -m pip3 install --upgrade pymongo

安装完成后,打开Python交互环境并导入PyMongo模块。若导入过程未报错(如参考图示),即表示安装成功。

1.2 连接数据库

使用PyMongo操作MongoDB前,首要步骤是初始化数据库连接。

若MongoDB服务运行在本地电脑,且未修改默认端口或添加用户名密码验证,则初始化MongoClient实例时无需传递参数,直接按以下格式编写代码即可。

import pymongo
conn = pymongo.MongoClient()

若MongoDB部署在其他服务器上,则需使用URI(统一资源标志符)来指定连接地址。

import pymongo
conn = pymongo.MongoClient('mongodb://test:12345@45.10.110.77:27019')

MongoDB的URI标准格式为:mongodb://用户名:密码@服务器IP或域名:端口。例如,连接远程服务器的代码示例如下。

若服务器未设置权限验证,则无需提供用户名和密码,连接字符串可简化为仅包含IP和端口。

import pymongo
conn = pymongo.MongoClient('mongodb://45.10.110.77:27019')

1.3 连接库与集合

PyMongo提供了两种连接数据库和集合的方式。

  • 方式1

连接数据库与集合的方法1

from pymongo import MongoClient
conn = MongoClient()
databae = conn.数据库名
collection = database.集合名

需注意,在此方式中,代码里的“数据库名”和“集合名”并非变量,而是直接对应的字符串名称。例如,要连接名为example_data_1的集合,Python代码如下。

from pymongo import MongoClient
conn = MongoClient()
database = conn.chapter_1
collection = database.example_data_1
  • 方式2

连接数据库与集合方法2

from pymongo import MongoClient
db_name = 'chapter_1'
collection_name = 'example_data_1'
conn = MongoClient()
database = conn[db_name]
collection = database[collection_name]

使用方式2时,方括号内可直接填入变量以动态指定库名和集合名,当然也可以直接填入字符串常量。例如。

from pymongo import MongoClient
conn = MongoClient()
database = conn['chapter_1']
collection = database['example_data_1']

方式1和方式2的执行效果完全一致,开发者可根据个人习惯任选其一。

方式2在需要批量操作数据库的场景下尤为实用。例如项目中存在多个测试环境,需同时更新这些环境对应的数据库时,可使用方式2。因为可以将多个数据库名或集合名存入列表,再通过循环进行操作,如下所示。

database_name_list = ['develop_env_alpha','develop_env_beta','develop_env_preflight']
for each_db in database_name_list:
        database = conn[each_db]
    collection = database.account
    collection.updateMany(.....)

其中第3行代码在循环内每次连接不同的库,这样可同时更新多个数据库的信息。对于同一数据库内的多个集合,也可采用此方法进行操作。

注意:在MongoDB中,集合只有在插入内容后才会真正创建。也就是说,向集合中插入一个文档(记录)后,该集合才会被实际创建。

2 MongoDB命令在Python中的对应方法

获取集合连接对象collection后,即可利用该对象的各种方法来操作MongoDB。

虽然MongoDB命令与collection方法名在写法上存在细微差异,但绝大多数MongoDB语句的参数可直接复制到Python代码中使用。

MongoDB命令采用驼峰命名法,而PyMongo采用“小写字母加下划线”的命名方式。两者的具体对比见下表。

MongoDB命令PyMongo方法
insertOneinsert_one
insertManyinsert_many
findfind
updateoneupdate_one
updateManyupdate_many
deleteOnedelete_one
deleteManydelete_many

例如,在Robo 3T中执行的批量插入语句。

db.getCollection('example_data_1').insertMany([
     {'name': '赵小三','age':20,'address':'北京'},
   {'name': '钱小四','age':21,'address':'上海'},
   {'name': '孙小五','age':20,'address':'山东'},
   {'name': '李小六','age':23,'address':'河北'},
   {'name': '欧阳小七','age':24,'address':'杭州'}
 ])

在Python中实现批量插入数据的代码如下。

from pymongo import MongoClient
conn = MongoClient()
database = conn.chapter_1
collection = database.example_data_2
collection.insert_many([
   {'name': '王小二','age':21,'student':True,'address':'广州'},
   {'name': '赵小三','age':20,'student':True,'address':'北京'},
   {'name': '钱小四','age':21,'student':True,'address':'上海'},
   {'name': '孙小五','age':20,'student':True,'address':'山东'},
   {'name': '李小六','age': None,'student':True,'address':'河北'},
   {'name': '欧阳小七','age':24,'student':False,'address':'杭州'},
   {'name': '公孙小八','age':25,'student':False,'address':'广州'}
 ])

其中,第4行代码使用了新的集合名称以作区分。

使用Python操作MongoDB的另一个优势是:若当前使用的库或集合不存在,调用插入方法后,PyMongo会自动创建对应的库或集合。

综上所述,绝大部分操作可直接从Robo 3T复制到Python中运行,几乎无需修改。

3 插入数据到MongoDB

基本语法

collection.insert_one(字典)  # 插入一条数据
collection.insert_many(包含字典的列表)  # 批量插入多条数据

被插入的数据格式

{'field_1': value_1, 'field_2': value_2}
[
 {'field_1': value_1, 'field_2': value_2},
 {'field_1': value_3, 'field_2': value_4}
]

说明

  • MongoDB无需提前创建数据库或集合,也无需预先定义数据格式。想插入什么数据,直接插入即可。
  • 同一集合的不同行数据,其字典结构可以不一致。

举例

在Python中,将字典{‘name’: ’王小六’, ‘age’: 25, ‘work’: ’厨师’}插入到MongoDB中。

具体命令如下。

collection.insert_one({'name': '王小六', 'age': 25, 'work': '厨师'})

提示:PyMongo还提供了一个通用方法——collection.insert()。

  • 如果传入的是一个字典,则collection.insert()相当于insert_one。
  • 如果传入的是一个包含字典的列表,则collection.insert()相当于insert_many。

但是PyMongo开发者计划移除该方法,因此不推荐在正式环境中使用此方法。

4 从MongoDB中查询数据

查询一条数据

我们可以使用find_one()方法来查询集合中的一条数据,例如查询example_data_2文档中的第一条数据。

from pymongo import MongoClient
db_name = 'chapter_1'
collection_name = 'example_data_1'
conn = MongoClient()
database = conn[db_name]
collection = database[collection_name]
x=collection.find_one({})
print(x)

输出结果。

查询集合中所有数据

from pymongo import MongoClient
db_name = 'chapter_1'
collection_name = 'example_data_1'
conn = MongoClient()
database = conn[db_name]
collection = database[collection_name]
collection = database.example_data_2
rows = collection.find()
for row in rows:
    print(row)

结果如下。

逻辑查询

collection.find({'字段名': {'基本符号': 边界值, '基本符号': 边界值}})

在Python中,从MongoDB中查询所有“age”大于21且小于25,并且“name”不等于“夏侯小七”的记录。

collection = database.example_data_2
rows = collection.find({'age':{'$lt':25,'$gt':21},
                        'name':{'$ne':'公孙小八'}})
for row in rows:
    print(row)

运行效果如图所示。

查询并对结果进行计数

collection.find().count()

查询并对结果进行计数

# 在Python中
collection.find().sort('字段名', 方向)
# 在Robo 3T的命令输入区域
collection.find().sort({'字段名': 方向})

其中方向为1表示升序,方向为**-1**表示降序。

对字段去重

# 对字段去重
handler.distinct('字段名')
# 先筛选再去重
handler.distinct('字段名', 查询条件)

注意:如果字段的数量很大,那么轻易不要在Robo 3T里面直接执行,否则可能导致Robo 3T卡死。

5 更新/删除MongoDB中的数据

基本语法

# 更新一条数据
collection.update_one(查询条件, {'$set': 被更新的数据})
# 更新所有满足要求的数据
collection.update_many(查询条件, {'$set': 被更新的数据})

被更新的数据

{'field_1': value_1, 'field_2': value_2}

举例

在Python中更新数据和删除数据。

(1)对于“name”为“公孙小八”的记录,将“age”更新为80,将“address”更新为“美国”。

(2)删除“age”为0的数据。

1.更新MongoDB中的数据

在Python中,可以使用update_many方法来批量更新数据。

collection.update_many(
    {'name': '公孙小八'},
    {'$set': {'address': '英国','age':80}})

更新操作还支持一个“upsert”参数。该参数的作用是:如果数据存在,则更新;如果数据不存在,则创建。

例如,对于“name”为“隐身人”的记录,将“age”改为0,将“address”改为“里世界”。

由于example_data_1中没有这一条记录,因此直接更新会报错,如图所示。

result = collection.update_one({'name':'隐身人'},
                               {'$set':{'name':'隐身人',
                                        'age': 0,
                                        'address':'里世界'}})
print(list(result))

加上“upsert”参数,看看效果。

result = collection.update_one({'name':'隐身人'},
                               {'$set':{'name':'隐身人',
                                        'age': 0,
                                        'address':'里世界'}},
                                upsert = True)
print(result)

提示:如果打开了更新或插入功能,则“$set”的值是完整的文档内容,应该包含每一个字段,而不仅仅是需要被更新的字段,否则被插入的内容只有被更新的这几个字段。

2.删除MongoDB中的数据 基本语法

# 删除第一个满足条件的数据
collection.delete_one(查询条件)
# 删除所有满足条件的数据
collection.delete_many(查询条件)

删除“age”为0的数据。删除语句如下。

collection.delete_many({'age': 0})

建议先写查询语句,确认查询出来的数据就是自己想删除的数据,然后把关键字find改为delete_one或者delete_many。

6 MongoDB与Python不通用的操作

绝大部分情况下,MongoDB中的命令参数直接复制到Python中就可以使用,但有一些情况例外。假设数据集example_data_2如图所示。

6.1 空值

在MongoDB中,空值写作null,在Python中,空值写作None。

MongoDB不认识None,Python不认识null。

为了从数据集example_data_2中查询出所有“age”字段为空的数据,在Robo 3T中的查询语句为。

db.getCollection('example_data_2').find({'age': null})

运行结果如图所示。

如果直接把这段查询语句中的参数搬到Python中运行,则会导致报错,如图所示。

Python会把null当作一个普通的变量,但是这个变量又没有定义,所以导致报错。

在Python中,要查询空值需要使用None,对上述代码做一些修改——把“null”改为“None”,则查询成功,如图所示。

6.2 布尔值

布尔值就是“真”和“假”两个值。在MongoDB中,“真”为true,“假”为false,首字母小写;在Python中,“真”为True,“假”为False,首字母大写。

在MongoDB中,查询所有student为true的记录,如图所示。

如果把这段查询语句的参数直接复制到Python中,同样也会导致报错,因为Python会把true当作一个普通的变量,如图所示。

把true改为True,则查询成功,如图所示。

6.3 排序参数

对查询到的结果进行排序是一个常见操作,在MongoDB中,sort()命令接收一个参数,这个参数是一个字典,Key是被排序的字段名,值为1或者−1。

对于数据集example_data_2,在Robo 3T中对“age”字段进行倒序排列,如图所示。

但在Python中,查询结果的sort()方法如果使用MongoDB的写法则会报错,如图所示。

在Python中,sort()方法接收两个参数:第1个参数为字段名,第2个参数为-1或者1。就能够正常运行,如图所示。

6.4 查询_id

在Robo 3T中,可以根据_id的值来查询文档。此时查询语句如下。

在安装PyMongo的同时,Python会自动安装一个叫作“bson”的第三方库。ObjectId这个类需要从bson库中导入,具体命令如下。

from bson import ObjectId
collection.find({'_id': ObjectId('5e8ac5dfdd9cf99b7a446e99')})

运行结果如下。

小结

本文首先介绍了MongoDB的安装,然后介绍了MongoDB的图形化操作软件Robo 3T。通过Robo 3T的命令输入窗口输入命令,可实现对MongoDB数据库的增、删、改、查操作。

MongoDB的大部分操作都可以平滑移植到Python中。因此,大多数情况下,直接把Robo 3T中的MongoDB操作语句复制到Python中就能使用。当然,有很小一部分情况例外。

总结

到此这篇关于利用Python操作MongoDB数据库的文章就介绍到这了,更多相关Python操作MongoDB内容请搜索本站以前的文章或继续浏览下面的相关文章,希望大家以后多多支持本站!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。