Python3 之 PyMongo 的安装与使用

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

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

        直接使用 pip 安装:

pip install pymongo

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

        这个网站上找到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:12345@192.168.0.5: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 。使用任意文本编辑器打开这个配置文件,就可以看到它的内容。


        其中,“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的逻辑查询符号和意义:


        它们的用法为:

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平台,转载请附上原文出处链接及本声明。

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

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值