首页

3.5使用Python操作MongoDB

关灯 护眼    字体:

上一章 目录 下一章




在工程中,一般都需要一种编程语言来操作数据库。使用Python来操作数据库有着天然的优势,因为Python的字典和MongoDB的文档几乎是一样的格式。



3.5.1  连接数据库


1.安装PyMongo

使用Python操作MongoDB需要使用一个第三方库——PyMongo。安装这个库与安装Python其他的第三方库一样,使用pip安装即可:

python3  -m  pip  install  pymongo

安装完成以后,打开Python交互环境,导入PyMongo。如果不报错(如图3-56所示),则表示安装成功。

图3-56  不报错表示安装成功

2.连接数据库

要使用PyMongo操作MongoDB,首先需要初始化数据库连接。

(1)如果  MongoDB  就运行在本地电脑上,而且也没有修改端口或者添加用户名和密码,则初始化MongoClient的实例不需要带参数,直接写为以下格式:

(2)如果MongoDB运行在其他服务器上,则需要使用“URI(Uniform  Resource  Identifier,统一资源标志符)”来指定链接地址。MongoDB  URI的格式如下:

mongodb://用户名:密码@服务器IP或域名:端口

例如:

(3)如果没有设置权限验证,则不需要用户名和密码,可以写为:

本章使用不设置密码、不改端口、本地运行的MongoDB。

3.连接库与集合

PyMongo连接库与集合有两种方式。

●  方式1,见代码3-8。

代码3-8  连接数据库与集合的方法1

需要注意,在使用这种方式时,代码中的“数据库名”和“集合名”都不是变量名,它们直接就是库的名字和集合的名字。例如,要连接上example_data_1所在的集合,则Python代码如下:

●  方式2,见代码3-9。

代码3-9  连接数据库与集合方法2

在使用这种方式时,在方括号中可以直接填变量来指定库名和集合名。当然,也可以直接填字符串,例如:

方式1  和方式2效果是完全相同的。读者可以任意选择一种自己喜欢的方式。

方式2主要用在需要批量操作数据库的情况下。例如在工程中,有时有多个测试环境,现在需要同时更新这些环境对应的数据库,则可以使用方式2。因为,这样可以将多个数据库的名字或者是多个集合的名字保存在列表中,然后再使用循环来进行操作,见代码3-10。

代码3-10  使用循环连接多个集合

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



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


在获取到集合连接对象collection后,就可以用这个对象的各个方法来操作MongoDB了。

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

MongoDB的命令使用的是驼峰命名法,而PyMongo使用的是“小写字母加下划线”的方式。它们的对比见表3-3。

表3-3  MongoDB命令与PyMongo方法对照表

例如,Robo  3T执行的批量插入语句见代码3-11。

代码3-11  在Robo  3T中批量插入数据

对应到Python中,见代码3-12。

代码3-12  使用Python批量插入数据

其中,第4行代码中使用了新的集合名字,用以区别。

使用Python操作MongoDB还有一个好处:如果当前使用的库或者集合不存在,则在调用了插入方法以后,PyMongo会自动创建对应的库或集合。

总之,绝大部分的操作,直接从Robo  3T中复制到Python中都可以运行,几乎不需要修改。



3.5.3  实例8:插入数据到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开发者准备移除它,因此不推荐读者在正式环境中使用这个方法。



3.5.4  实例9:从MongoDB中查询数据


实例描述

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

具体见代码3-13。

代码3-13  在Python中查询所有“age”大于21小于25,并且“name”不等于“夏侯小七”的记录

运行效果如图3-57所示。

图3-57  使用Python查询MongoDB




3.5.5  实例10:更新/删除MongoDB中的数据


实例描述

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

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

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

1.更新MongoDB中的数据

在Python中,可以使用udate_many方法来批量更新数据,见代码3-14。

代码3-14  在Python中更新多条数据

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

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

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

图3-58  直接更新不存在的记录会导致报错

加上“upsert”参数,见代码3-15。

代码3-15  在Python中更新或者插入一条数据

运行效果如图3-59所示。

图3-59  运行效果

提示:

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

2.删除MongoDB中的数据

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

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




上一章 目录 下一章