利用Python操作MongoDB数据库的详细指南
本文详细介绍如何使用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方法 |
|---|---|
| insertOne | insert_one |
| insertMany | insert_many |
| find | find |
| updateone | update_one |
| updateMany | update_many |
| deleteOne | delete_one |
| deleteMany | delete_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内容请搜索本站以前的文章或继续浏览下面的相关文章,希望大家以后多多支持本站!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













