3.6MongoDB与Python不通用的操作
绝大部分情况下,MongoDB中的命令参数直接复制到Python中就可以使用,但有一些情况例外。假设数据集example_data_2如图3-60所示。
图3-60 数据集example_data_2
1.空值
在MongoDB中,空值写作null。在Python中,空值写作None。
MongoDB不认识None,Python不认识null。
为了从数据集example_data_2中查询出所有“grade”字段为空的数据,在Robo 3T中的查询语句为:
db.getCollection('example_data_2').find({'grade': null})
运行效果如图3-61所示。
图3-61 查询grade为null的数据
如果直接把这段查询语句中的参数搬到Python中运行,则会导致报错,如图3-62所示。
图3-62 Python不认识null
Python会把null当作一个普通的变量,但是这个变量又没有定义,所以导致报错。
在 Python 中,要查询空值需要使用 None。对上述代码做一些修改——把“null”改为“None”,则查询成功,如图3-63所示。
图3-63 使用None作为空值查询成功
2.布尔值
布尔值就是“真”和“假”两个值。
在MongoDB中,“真”为true,“假”为false,首字母小写;在Python中,“真”为True,“假”为False,首字母大写。
在MongoDB中,查询所有student为true的记录,如图3-64所示。
图3-64 查询student字段为true的数据
如果把这段查询语句的参数直接复制到 Python 中,同样也会导致报错,因为 Python 会把true当作一个普通的变量,如图3-65所示。
图3-65 Python不认识true
把true改为True,则查询成功,如图3-66所示。
图3-66 把true改为True查询成功
3.排序参数
对查询到的结果进行排序是一个常见操作。在MongoDB中,sort()命令接收一个参数,这个参数是一个字典,Key是被排序的字段名,值为1或者−1。
对于数据集example_data_2,在Robo 3T中对“age”字段进行倒序排列,如图3-67所示。
图3-67 对age倒序排序
但在Python中,查询结果的sort()方法如果使用MongoDB的写法则会报错,如图3-68所示。
图3-68 Python中的sort()接收字典会报错
在Python中,sort()方法接收两个参数:第1个参数为字段名,第2个参数为-1或者1。写成如图3-69所示样子就能够正常运行。
图3-69 Python的sort()接收两个参数
4.查询_id
在Robo 3T中,可以根据_id的值来查询文档。此时查询语句如下:
运行效果如图3-70所示。
图3-70 根据_id查询数据
在安装PyMongo的同时,Python会自动安装一个叫作“bson”的第三方库。ObjectId这个类需要从bson库中导入,具体命令如下:
from bson import ObjectId
collection.find({'_id': ObjectId('5b2f75d26b78a61364d09f45')})
运行效果如图3-71所示。
图3-71 从bson库导入ObjectId类
本章小结
本章首先介绍了MongoDB的安装,然后介绍了MongoDB的图形化操作软件Robo 3T。通过Robo 3T的命令输入窗口输入命令,可实现对MongoDB数据库的增、删、改、查操作。
MongoDB的大部分操作都可以平滑移植到Python中。因此,大多数情况下,直接把Robo 3T中的MongoDB操作语句复制到Python中就能使用。当然,有很小一部分情况例外。