Python 连接 MongoDB 数据库

MongoDB 是什么?

目前大部分数据库都是 “关系型数据库”,这种数据库都是通过 SQL 语句来进行操作的,比如前面介绍的 SQLite 和 MySQL。除了关系型数据库,还有一种 “非关系型数据库”。这种数据库并非通过 SQL 语句来操作,因而也被称作 “NoSQL 数据库”。

实际上,我们经常所说的 “大数据技术”,用得最多的数据库就是 NoSQL 数据库。Python 和 NoSQL 的结合,给科学计算、大数据分析、人工智能等提供了一整套成熟的解决思路。NoSQL 数据库有非常多,包括 MongoDB、Redis、HBase 等。接下来介绍最常用的 NoSQL 数据库——MongoDB。

MongoDB

MongoDB 是一个数据库软件,同样需要下载和安装才能使用,具体步骤请查看配套文件中的 “MongoDB 安装教程”。请在安装了 MongoDB 后,再来学习接下来的内容。

启动 MongoDB 服务

与 MySQL 不一样,我们需要手动开启 MongoDB 服务,然后才能使用它。在启动服务之前,我们要确保重启了一次电脑。如果想要启动 MongoDB 服务,只需执行以下简单的两步即可。

① 打开 Windows 服务:在电脑左下角的搜索框中输入 “服务”,然后单击选择【服务】这一项,如下图所示。

打开 Windows 服务

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

启动 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 的层级结构如下图所示。

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})

MongoDB 查询数据

此时的 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)

MongoDB 条件查询

{'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)

MongoDB 使用正则表达式查询

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)

MongoDB 删除数据

如果想要删除所有数据,只需让 delete_many() 方法接收一个空字典即可,代码如下。需要注意的是,对于删除数据,我们要特别小心才行,以免误删。

# 删除所有数据
query = {}
collection.delete_many(query)

上一篇: Python 连接 MySQL

下一篇: Python 异常处理

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号