Python3 之 PyMongo 的安装与使用

        PyMongo 模块是 Python 对 MongoDB 操作的接口包,能够实现对 MongoDB 的增删改查及排序等操作。

一.PyMongo 的安装直接使用 pip 安装

        直接使用 pip 安装:

pip install pymongo

        注意事项:直接使用 pip 安装可能会遇到网络问题导致安装失败,因此,对于 Windows11 系统可以访问 http://www.lfd.uci.edu/~gohlke/pythonlibs/。

Python3 之 PyMongo 的安装与使用_第1张图片

        这个网站上找到PyMongo,并将whl包下载到本地,然后使用以下命令安装:

pip install 下载下来的whl文件名

        安装完成后,打开 Python 的交互环境,输入以下代码并按 Enter 键,安装过程没报错,在终端输入[ import pymongo ] 导入 PyMongo 不报错就表示安装成功。

二.PyMongo的使用

(1)使用PyMongo初始化数据库

        要使用PyMongo操作MongoDB,首先需要初始化数据库连接。如果MongoDB运行在本地计算机上,而且也没有修改端口或者添加用户名及密码,那么初始化MongoClient的实例的时候就不需要带参数,直接写为:

from pymongo import MongoClient
client = MongoClient()

        如果 MongoDB 是运行在其他服务器上面的,那么就需要使用 “URI(Uniform Resource Identifier,统一资源标志符)” 来指定连接地址。MongoDB URI 的格式为:

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

例如:

from pymongo import MongoClient
client = MongoClient('mongodb://kingname:[email protected]:27019')

        如果没有设置权限验证,就不需要用户名和密码,那么可以写为:

from pymongo import MongoClient
client = MongoClient('mongodb://192.168.0.5:27019')

        PyMongo 初始化数据库与集合有两种方式。

方式1:

from pymongo import MongoClient
client = MongoClient()
database= client.YuanXiaoHouZi6
collection = database.spider

        需要注意,使用方式1的时候,代码中的 “YuanXiaoHouZi6” 和 “spider” 都不是变量名,它们直接就是库的名字和集合的名字。

方式2:

from pymongo import MongoClient
client = MongoClient()
database = client['YuanXiaoHouZi6']
collection = db1['spider']

        使用方式2时,在方括号中指定库名和集合名。这种情况下,方括号里除了直接写普通的字符串以外,还可以写一个变量。例如:

db_name = 'YuanXiaoHouZi6'
col_name = 'spider'
database = client[db_name]
collection = client[col_name]

        方式1和方式2是完全等价的。但是当需要批量操作数据库的时候,方式2的优越性就能体现出来。因为可以将多个数据库的名字或者是多个集合的名字保存在列表中,然后使用循环来进行操作:

database_name_list = ['db1', 'db2', 'db3', 'db4']
for each_db in database_name_list:
    database = client[each_db]
    collection = db.test
    ...

        这样就可以很方便地操作多个数据库了。对于同一个数据库里面的多个集合,也可以使用这个方法来操作。默认情况下,MongoDB 只允许本机访问数据库。这是因为MongoDB 默认没有访问密码,出于安全性的考虑,不允许外网访问。如果需要从外网访问数据库,那么需要修改安装 MongoDB 时用到的配置文件 mongod.conf 。使用任意文本编辑器打开这个配置文件,就可以看到它的内容。

Python3 之 PyMongo 的安装与使用_第2张图片
        其中,“bindIp” 这一项的默认值为 127.0.0.1 ,也就是只允许本机访问。如果需要从其他计算机访问这个 MongoDB ,那么老版本的 MongoDB 就需要把这个 IP 地址修改为运行 MongoDB 这台计算机的IP地址,而新版本的 MongoDB 需要把这个 IP 地址修改为 0.0.0.0。修改配置文件以后重新启动 MongoDB ,这样其他计算机就可以访问 MongoDB 了。此时,PyMongo 初始化数据库连接的代码就要做相应的修改,例如,MongoDB 运行在 192.168.0.5 这台计算机的 27017 端口上,那么 PyMongo 的代码就要修改为:

from pymongo import MongoClient
client = MongoClient('mongodb://192.168.0.5:27017 ')
database = client['YuanXiaoHouZi6']
collection = db1['spider']

建议:在非必要情况下不允许外网访问 MongoDB。

(2)插入数据

        MongoDB 的插入操作非常简单。用到的方法为 insert(参数),插入的参数就是 Python 的字典。插入一条数据的代码如下。

from pymongo import MongoClient
client = MongoClient()
database = client['YuanXiaoHouZi6']
collection = db1['spider']

data = {'id': 123, 'name': 'kingname', 'age': 20, 'salary': 999999}
collection.insert(data)

        MongoDB 会自动添加一列“_id”,这一列里面的数据叫作 ObjectId , ObjectId 是在数据被插入 MongoDB 的瞬间,通过一定的算法计算出来的。因此,_id 这一列就代表了数据插入的时间,它不重复,而且始终递增。通过一定的算法,可以把 ObjectId 反向恢复为时间。

        将多个字典放入列表中,并将列表作为 insert() 方法的参数,即可实现批量插入数据,代码如下。

more_data = [
    {'id': 2, 'name': ’张三’, 'age': 10, 'salary': 0},
    {'id': 3, 'name': ’李四’, 'age': 30, 'salary': -100},
    {'id': 4, 'name': ’王五’, 'age': 40, 'salary': 1000},
    {'id': 5, 'name': ’猿小猴子’, 'age': 50, 'salary': ’未知’},
]
collection.insert(more_data)

        在爬虫开发中,主要用 MongoDB 来存储数据。所以爬虫主要用到的 MongoDB 方法就是这个 insert() 方法。

(3)普通查找

        MongoDB 的查找功能对应的方法是:

find(查询条件,返回字段)
find_one(查询条件,返回字段)

        两个参数的类型均为Python字典,参数可以省略。其中,find_one()一次只返回一条信息。因此用得最多的是find()这个方法。普通查询方法有以下3种写法。

# 在不写find()方法的参数时,表示获取指定集合中所有内容的所有字段
content = collection.find()
# 在find()中添加第1个参数,只查询所有年龄为29岁的人
content = collection.find({'age': 29})
# 通过find()的第2个参数可以限定需要返回哪些内容
content = collection.find({'age': 29}, {'_id': 0, 'name': 1, 'salary': 1})

        find()方法的第2个参数指定返回内容。这个参数是一个字典,Key就是字段的名称,Value是0或者1,0表示不返回这个字段,1表示返回这个字段。其中_id比较特殊,必须人工指定它的值为0,这样才不会返回。而对于其他数据,应该统一使用返回,或者统一使用不返回。例如:

collection.find({}, {'name': 1, 'salary': 1})
collection.find({}, {'age': 0})

        但是下面这种写法就不够规范了:

collection.find({}, {'name': 1, 'age': 0})

        这种写法会导致程序报错,而且后面的“'age': 0”也是多此一举。因为一旦指定了哪些字段要返回,那么没有被指定的自然就是不返回的,所以“'age': 0”从逻辑上说,加和不加的效果是一样的,但是从语法上说,PyMongo不允许这样写。只有_id是一个例外,必须要指定“'_id': 0”,才不会返回,否则默认都要返回。在上面的代码中,出现了列表推导式:

content = [x for x in collection.find({'age': 29}, {'_id': 0, 'name': 1, 'salary': 1})]

        这里之所以用列表推导式,是为了让数据在调试模式的窗口中直观地显示出来。因为find()方法返回的是一个可以迭代的PyMongo对象,这个对象可以被for循环展开。展开以后可以得到很多个字典。每个字典对应一条记录。所以这个列表推导式也可以改写为for循环:

content_obj = collection.find({'age': 29}, {'_id': 0, 'name': 1, 'salary': 1})
content = []
for each in content_obj:
    content.append(each)

(4)逻辑查询

        PyMongo也支持大于、小于、大于等于、小于等于、等于、不等于这类逻辑查询。

        对应的关键词如下表,PyMongo的逻辑查询符号和意义:

Python3 之 PyMongo 的安装与使用_第3张图片
        它们的用法为:

collection.find({'age': {'$gt': 29}}) #查询所有age > 29的记录
collection.find({'age': {'$gte':29, '$lte':40}})  #查询29 ≤ age ≤ 40的记录
collection.find({'salary': {'$ne': 29}}) #查询所有salary不等于29的记录

 (5)对查询结果排序

        MongoDB支持对查询到的结果进行排序。排序的方法为sort()。它的格式为:

handler.find().sort(’列名’, 1或-1)

        查询一般和find()配合在一起使用。例如:

collection.find({'age': {'$gte': 29, '$lte': 40}}).sort('age', -1)
collection.find({'age': {'$gte': 29, '$lte': 40}}).sort('age', 1)

        首先查询所有年龄大于等于29岁、小于等于40岁的记录,然后按年龄来进行排序。sort()方法接收两个参数:第1个参数指明需要以哪一项进行排序;第2个参数-1表示降序,1表示升序。

(6)更新记录

        更新可使用update_one()和update_many()方法。它们的格式为:

collection.update_one(参数1, 参数2)
collection.update_many(参数1, 参数2)

        第1行代码的作用是,将第1个年龄为20岁的人的名字改为kingname。第2行代码的作用是,将所有年龄为20岁的人的年龄全部改为30。注意这里的第1个参数,在find()里面可以用到的逻辑查询在这里也可以使用。
(7)删除记录

        删除可使用delete_one()和delete_many()方法。它们的格式为:

collection.delete_one(参数)
collection.delete_many(参数)

        这里的参数都是字典,不建议省略。delete_one()方法只删除一条记录,delete_many()删除所有符合要求的记录。

col.delete_one({'name': 'kingname'})
col.delete_many({'name': 'kingname'})

        第1行代码删除第1个名字叫作kingname的人。
        第2行代码删除所有名字叫作kingname的人。

(8)对查询结果去重

        去重使用distinct()方法,其格式为:

collection.distinct(’列名’)

--------------------------------------

版权声明:本文为【PythonJsGo】博主的文章,同步在【猿小猴子】WeChat平台,转载请附上原文出处链接及本声明。

--------------------------------------

你可能感兴趣的:(python,开发语言,mongodb)