MongoDB 是什么?
目前大部分数据库都是 “关系型数据库”,这种数据库都是通过 SQL 语句来进行操作的,比如前面介绍的 SQLite 和 MySQL。除了关系型数据库,还有一种 “非关系型数据库”。这种数据库并非通过 SQL 语句来操作,因而也被称作 “NoSQL 数据库”。
实际上,我们经常所说的 “大数据技术”,用得最多的数据库就是 NoSQL 数据库。Python 和 NoSQL 的结合,给科学计算、大数据分析、人工智能等提供了一整套成熟的解决思路。NoSQL 数据库有非常多,包括 MongoDB、Redis、HBase 等。接下来介绍最常用的 NoSQL 数据库——MongoDB。

MongoDB 是一个数据库软件,同样需要下载和安装才能使用,具体步骤请查看配套文件中的 “MongoDB 安装教程”。请在安装了 MongoDB 后,再来学习接下来的内容。
启动 MongoDB 服务
与 MySQL 不一样,我们需要手动开启 MongoDB 服务,然后才能使用它。在启动服务之前,我们要确保重启了一次电脑。如果想要启动 MongoDB 服务,只需执行以下简单的两步即可。
① 打开 Windows 服务:在电脑左下角的搜索框中输入 “服务”,然后单击选择【服务】这一项,如下图所示。

② 启动 MongoDB 服务:接着单击选中【MongoDB Server】这一项,单击鼠标右键并选择【启动】,如下图所示。这样就开启了 MongoDB 服务。

Python 如何操作 MongoDB
在 Python 中,我们可以使用 pymongo 模块来操作 MongoDB。由于 pymongo 是第三方模块,在使用之前,需要执行以下命令来安装。
pip install pymongo示例 1:Python 创建 MongoDB 数据库
import pymongo
client = pymongo.MongoClient('localhost', 27017)
db = client['test']
collection = db['product']分析:
Python 创建 MongoDB 数据库很简单,首先使用 pymongo 模块的 MongoClient() 函数来创建一个 MongoClient 对象。'localhost' 表示使用本地服务器,27017 是端口号,这两个值一般是固定的。
client['test'] 表示使用 MongoClient 对象来创建一个名为 test 的数据库。如果 MongoDB 中已经存在 test 数据库,那么 client['test'] 就表示连接该数据库。然后,client['test'] 会返回一个 Database 对象。
db['product'] 表示使用 Database 对象来创建一个名为 product 的集合。如果 test 数据库中已经存在 product 集合,那么 db['product'] 就表示连接该集合。然后,db['product'] 会返回一个 Collection 对象。
Python 对 MongoDB 的增删查改
在 Python 中,对于 MongoDB 的增删查改这 4 种操作,我们都是使用 Collection 对象来实现的。
1. 增
在 MongoDB 中,我们可以使用 Collection 对象的 insert_many() 方法来插入一个或多个文档。需要清楚的是,MongoDB 中的一个集合相当于一张表,而一个文档相当于一条记录。MongoDB 的层级结构如下图所示。

语法:
collection.insert_many(列表)说明:
insert_many() 方法接收一个列表作为参数,列表中每一个元素都是一个字典。实际上,这种列表本质上是 JSON 格式数据。
示例 2:MongoDB 增加数据
import pymongo
# 连接数据库
client = pymongo.MongoClient('localhost', 27017)
db = client['test']
collection = db['product']
# 插入文档
data = [
{'_id': 1, 'name': '橡皮', 'type': '文具', 'price': 2.5},
{'_id': 2, 'name': '尺子', 'type': '文具', 'price': 1.2},
{'_id': 3, 'name': '铅笔', 'type': '文具', 'price': 4.6},
{'_id': 4, 'name': '筷子', 'type': '餐具', 'price': 39.9},
{'_id': 5, 'name': '汤勺', 'type': '餐具', 'price': 12.5}
]
x = collection.insert_many(data)
print(x.inserted_ids)运行结果如下。
[1, 2, 3, 4, 5]分析:
如果在插入文档时指定了 _id 字段(注意是 _id,而不是 id),那么 _id 字段就会自动成为该表的主键。如果没有指定 _id 字段,那么 MongoDB 就会为每一个文档添加一个唯一的 _id 字段。
此外,x.inserted_ids 是一个列表,表示获取插入数据的 _id 字段值。
提示: 如果只是插入一个文档(即一条记录),除了使用 insert_many() 方法之外,还可以使用 insert_one() 方法。一般而言,我们只需要掌握 insert_many() 这一个方法即可。
2. 查
在 MongoDB 中,我们可以使用 Collection 对象的 find() 方法来查询符合条件的数据。
语法:
collection.find(查询条件)说明:
如果 find() 方法不加上查询条件,那么就表示查询所有数据。
示例 3:MongoDB 查询字段
import pymongo
# 连接数据库
client = pymongo.MongoClient('localhost', 27017)
db = client['test']
collection = db['product']
# 查询数据
result = collection.find()
# 打印结果
for item in result:
print(item)运行结果如下。
{'_id': 1, 'name': '橡皮', 'type': '文具', 'price': 2.5}
{'_id': 2, 'name': '尺子', 'type': '文具', 'price': 1.2}
{'_id': 3, 'name': '铅笔', 'type': '文具', 'price': 4.6}
{'_id': 4, 'name': '筷子', 'type': '餐具', 'price': 39.9}
{'_id': 5, 'name': '汤勺', 'type': '餐具', 'price': 12.5}分析:
想要获取所有字段,我们直接使用 Collection 对象的 find() 方法就可以了。find() 方法返回一个可迭代对象,然后可以使用 for 循环对其进行遍历。
如果想要查询某几个字段,比如只需要 name 和 price 这两个字段,此时可以使用下面代码来实现。将 “查询数据” 这部分的代码修改如下,再次运行后结果如下图所示。
# 查询数据
result = collection.find({}, {'name': 1, 'price': 1})
此时的 find() 方法接收两个参数:第 1 个参数是一个空字典,第 2 个参数也是一个字典。在第 2 个参数中,如果不想要某个字段,就设置该字段为 0,如果想要某个字段,就设置该字段为 1。
默认情况下会输出 _id 字段,因此该字段需要主动取消。如果只想输出 name 和 price 这两个字段,正确写法应该是:result = collection.find({}, {'_id': 0, 'name': 1, 'price': 1})。
示例 4:MongoDB 条件查询
import pymongo
# 连接数据库
client = pymongo.MongoClient('localhost', 27017)
db = client['test']
collection = db['product']
# 查询数据
query = {'name': '橡皮'}
result = collection.find(query)
# 打印结果
for item in result:
print(item)运行结果如下。
{'_id': 1, 'name': '橡皮', 'type': '文具', 'price': 2.5}分析:
想要根据某个条件来查询集合,我们需要给 find() 方法传递一个参数,该参数是一个字典。上面示例表示查询 name 值为 '橡皮' 的这条数据。
如果想要更高级的查询,比如查询 price 大于 10 的所有数据,可以写成下面这样。将 “查询数据” 这部分代码修改如下,再次运行结果如下图所示。
# 查询数据
query = {'price': {'$gt': 10}}
result = collection.find(query)
{'price': {'$gt': 10}} 表示针对 price 字段,$gt 表示大于。常用的比较符号如下表所示。
| 符号 | 含义 |
|---|---|
| $lt | 小于 |
| $gt | 大于 |
| $lte | 小于等于 |
| $gte | 大于等于 |
| $gt | 大于 |
| $in | 在范围内,如 {'price': {'$in': [10, 20]}} |
| $nin | 不在范围内,如 {'price': {'$nin': [10, 20]}} |
示例 5:MongoDB 使用正则表达式
import pymongo
# 连接数据库
client = pymongo.MongoClient('localhost', 27017)
db = client['test']
collection = db['product']
# 查询数据
query = {'name': {'$regex': '^橡'}}
result = collection.find(query)
# 打印结果
for item in result:
print(item)运行结果如下。
{'_id': 1, 'name': '橡皮', 'type': '文具', 'price': 2.5}分析:
上面示例查询 name 字段以 “橡” 开头的数据。如果想要获取 name 字段以 “子” 结尾的数据,可以写成下面这样。将 “查询数据” 这部分的代码再次运行后,结果如下图所示。
# 查询数据
query = {'name': {'$regex': '子$'}}
result = collection.find(query)
Python 中的 “正则表达式” 是一个强有力的手段,我们可不要把它给忘了。
3. 改
在 MongoDB 中,我们可以使用 Collection 对象的 update_many() 方法修改符合条件的数据。
语法:
collection.update_many(查询条件 , 修改数据)说明:
update_many() 方法接收两个参数,第 1 个参数是查询条件,第 2 个参数是修改数据。
示例 6:MongoDB 修改数据
import pymongo
# 连接数据库
client = pymongo.MongoClient('localhost', 27017)
db = client['test']
collection = db['product']
# 修改数据
query = {'name': '橡皮'}
values = {'$set': {'price': 6.6}}
collection.update_many(query, values)
# 打印结果
result = collection.find()
for item in result:
print(item)运行结果如下。
{'_id': 1, 'name': '橡皮', 'type': '文具', 'price': 6.6}
{'_id': 2, 'name': '尺子', 'type': '文具', 'price': 1.2}
{'_id': 3, 'name': '铅笔', 'type': '文具', 'price': 4.6}
{'_id': 4, 'name': '筷子', 'type': '餐具', 'price': 39.9}
{'_id': 5, 'name': '汤勺', 'type': '餐具', 'price': 12.5}分析:
上面示例表示找到 name 值为 '橡皮' 的数据,将其 price 修改为 6.6。从结果可以看出,橡皮的价格已经由原来的 2.5 被修改为 6.6 了。
4. 删
在 MongoDB 中,我们可以使用 Collection 对象的 delete_many() 方法删除一个或多个文档。
语法:
collection.delete_many(查询条件)说明:
查询条件是一个字典。如果是空字典,则表示删除所有数据。
示例 7:MongoDB 删除数据
import pymongo
# 连接数据库
client = pymongo.MongoClient('localhost', 27017)
db = client['test']
collection = db['product']
# 删除数据
query = {'name': '橡皮'}
collection.delete_many(query)
# 打印结果
result = collection.find()
for item in result:
print(item)运行结果如下。
{'_id': 2, 'name': '尺子', 'type': '文具', 'price': 1.2}
{'_id': 3, 'name': '铅笔', 'type': '文具', 'price': 4.6}
{'_id': 4, 'name': '筷子', 'type': '餐具', 'price': 39.9}
{'_id': 5, 'name': '汤勺', 'type': '餐具', 'price': 12.5}分析:
上面示例表示将 name 值为 '橡皮' 的这条数据删除。如果想要同时删除多条数据,比如同时删除 name 值为 '尺子' 和 '铅笔' 的数据,可能有些人会这样写:
# 删除数据
query = {'name': '尺子', 'name': '铅笔'}
collection.delete_many(query)事实上,上面这种写法是行不通的。正确的做法是使用正则表达式来实现,代码如下。再次运行后结果如下图所示。
# 删除数据
query = {'name': {'$regex': '尺子|铅笔'}}
collection.delete_many(query)
如果想要删除所有数据,只需让 delete_many() 方法接收一个空字典即可,代码如下。需要注意的是,对于删除数据,我们要特别小心才行,以免误删。
# 删除所有数据
query = {}
collection.delete_many(query)