【RPA开发】pymongo 使用教程

news2024/7/4 4:20:58

实际开发时抓取到的诸多数据如何保存是一个关键问题,MongoDB 相比传统关系型数据库(比如mysql)来说灵活度更高,爬虫时字段格式及数量很可能会随着需求或实际数据的变动而改变,因此 MongoDB 作为数据库来说最合适不过了。

目录

1 MongoDB

1.1 介绍

1.2 可视化工具

① Robo 3T(推荐)

② Navicat for MongoDB

③ Pycharm 专业版

2 pymongo 使用

2.1 pymongo 介绍

2.2 连接及指定数据库和集合

① 连接 MongoDB

② 指定数据库和集合

2.3 增删改查

① 插入数据

② 删除数据

③ 修改数据

④ 查询数据

2.4 pymongo 版本< 4.0 之异同

① < 4.0 权限认证

② < 4.0 插入数据

② < 4.0 删除数据

③ < 4.0 更新数据


1 MongoDB

1.1 介绍

官方文档:Introduction to MongoDB — MongoDB Manual

MongoDB 是一种流行的 NoSQL 数据库,也就是非关系型数据库,使用文档存储数据(简单来说就是 json 格式,如下图👇),而不是传统的关系型数据库中的行和表。总之,MongoDB 具有高度的可扩展性和灵活性,可以用于各种类型的应用程序。

然后简单介绍下 MongoDB 的结构,和 mysql 一样,MongoDB Server(实例)下紧接着就是数据库(db),但是数据库下边紧跟着的是集合(Collection) ,集合就是存储文档数据的单位。

本文我连接的是云服务器上的 MongoDB,当时通过 Docker 安装启动,有想了解的可以看一下这篇文章的第一部分即可 👇,至于本地 MongoDB 的安装配置,本文就不赘述了,网上教程蛮多,

Spring 03:云服务器 Docker 环境下安装 MongoDB 并连接 Spring 项目实现简单 CRUD

1.2 可视化工具

介绍以下几种 MongoDB GUI 可视化客户端管理工具:

① Robo 3T(推荐)

Robo 3T 前身是 Robomongo,后被 3T 公司收购,是一款免费开源的 GUI 管理工具。支持 MongoDB 4.0+,轻量级 GUI,支持语法填充等等,目前与 Studio 3T 合并。

下载地址:Robo 3T | Free, open-source MongoDB GUI

② Navicat for MongoDB

Navicat 拓展开发用于管理 MongoDB 的工具,属于付费型管理工具,好处是用会了一个 DB 版的 Navicat,如果 Navicat 用习惯的话会比较顺手。

下载地址:Navicat | 下载 Navicat for MongoDB

③ Pycharm 专业版

最新版的 Pycharm(IDEA 等) 已支持 MongoDB 乃至 Redis,可以说提供了很大方便。

本文是使用最后一种方式进行 MongoDB 的管理可视化。

2 pymongo 使用

2.1 pymongo 介绍

简单来说,pymongo 提供了一组简单而强大的 API,可以用于连接,查询和操作 MongoDB 数据库。

  • 官方地址:pymongo · PyPI
  • 安装:pip install pymogo

本文 pymogo 的版本为4.1.1,若 pymogo 版本低于 4.0,认证和操作函数会有些不一致(后边会讲解)。

2.2 连接及指定数据库和集合

① 连接 MongoDB

本地连接,无需权限认证:

以下是本地连接的两种方式,本地一般不设置账户密码,直接连接就行,27017是端口,localhost 也可替换为 127.0.0.1。

from pymongo import MongoClient

# 本地连接
client = MongoClient("mongodb://localhost:27017") #方式1
client = MongoClient('localhost',27017) #方式2

远程连接:需要权限认证:

远程连接则需要配置账户密码了,有下边两种方式,pymongo 4.0版本之前的稍不一样,在 2.4 章节有解释。

from pymongo import MongoClient

# 远程连接
client = MongoClient("mongodb://root:root@x.x.x.x:27017") #方式1
client = MongoClient("x.x.x.x", 27017, username="root", password="xxx") #方式2

② 指定数据库和集合

连接数据库后便是获取数据库和指定集合,“yinyudb”即数据名,“yinyucol”即集合名,集合是数据操作的基本单位,建议使用方式1,因为方式一返回的 col 能自动弹出实例的方法,而方式二不行。

#获取数据库
db = client['yinyudb']  #方式1
db = client.yinyudb #方式2

#指定集合
col = db['yinyucol'] #方式1
col = db.yinyucol #方式2

2.3 增删改查

① 插入数据

注意,此时 MongoDB 中并没有创建“yinyudb”这个数据库,当然也就没用“yinyucol”这个集合,而使用 pymongo 指定数据库+集合,插入数据后便会自动生成“yinyudb”数据库和“yinyucol”集合,这便是 MongoDB 的高度灵活性。

增加一条:

#增加一条
car = {'name': 'Audi', 'price': 52642}
result = col.insert_one(car)
print(result.inserted_id) # insert_one方法返回的是InsertOneResult对象,我们可以调用其inserted_id属性获取_id。
#输出:644e5cd69616930ff53dd95b

增加多条:

#增加多条
cars = [{'name': 'Mercedes', 'price': 57127},
        {'name': 'BYD', 'price': 29000, 'note':{'color': 'white', 'speed':'200'}}]
result = col.insert_many(cars) #中括号(集合)包裹json文档
print(result.inserted_ids) # insert_many()方法返回的类型是InsertManyResult,调用inserted_ids属性可以获取插入数据的_id列表
#输出:[ObjectId('644e5cd69616930ff53dd95c'), ObjectId('644e5cd69616930ff53dd95d')]

通过可视化工具查看 👇

② 删除数据

delete_one 和 delete_many 返回的类型是 deleted_result,此时可以使用 raw_result 获取删除结果,返回删除数量('n')和操作状态('ok'),也可以使用 deleted_count,那么只会返回删除数量。

删除一条:

# 删除一个
result = col.delete_one({'name': 'Mercedes'})
print(result.raw_result)
# 输出:{'n': 1, 'ok': 1.0}

删除多条:

# 删除多个
result = col.delete_many({'price': {'$lt': 55000}})
print(result.raw_result)
# 输出:{'n': 2, 'ok': 1.0}

注:如果数据库中已不存在需要删除的数据,那么该删除操作也不会报错,删除数量将是0。

③ 修改数据

修改数据就会特殊一点,需要用到 $ 类型操作符,比如 $set 是设置,既可修改字段,也可新增字段。主要有以下 $ 类型操作符(官方地址:Field Update Operators — MongoDB Manual)👇

 修改一条:

#修改一个,第2个参数需要使用$类型操作符作为字典的键名
#目标1:姓名为Mercedes的记录,price修改为80000
condition = {'name': 'Mercedes'}
res = col.find_one(condition)
res['price'] = 80000
result = col.update_one(condition, {'$set': res})
print(result.raw_result) #返回结果是UpdateResult类型
#输出:{'n': 1, 'nModified': 1, 'ok': 1.0, 'updatedExisting': True}
print(result.matched_count,result.modified_count) #获得匹配的数据条数、影响的数据条数
#1 1

#目标2:将pric高于60000的记录,price减500
condition = {'price': {'$gt':60000}} #若匹配到两条,也只会更新第一条
result = col.update_one(condition, {'$inc': {'price': -500}})
print(result.raw_result)
#输出:{'n': 1, 'nModified': 1, 'ok': 1.0, 'updatedExisting': True}

修改多条:

# 修改多个
#目标:将pricd低于60000的记录,price都加500
condition = {'price': {'$lt':60000}}
result = col.update_many(condition,{'$inc': {'price': 500}})
print(result.raw_result)
#{'n': 2, 'nModified': 2, 'ok': 1.0, 'updatedExisting': True}

④ 查询数据

查询数据的话我们可以通过 find_one() 或 find() 方法,find_one() 查询得到是单个结果,find() 则返回多个结果(查询可就没有 find_many() 方法了)。

查询所有

#若无入参,默认返回所有的数据
for i in col.find():
    print(i)
#{'_id': ObjectId('644e669757fdbcff71f7e3fd'), 'name': 'Audi', 'price': 52142}
# {'_id': ObjectId('644e669857fdbcff71f7e3fe'), 'name': 'Mercedes', 'price': 79500, 'note': '备注'}
# {'_id': ObjectId('644e669857fdbcff71f7e3ff'), 'name': 'Volvo', 'price': 29500, 'note': {'color': 'white', 'speed': '200'}}    

查询一条

#查询一条
#根据name字段查询
result = col.find_one({"name": "Mercedes"})
print(result) #返回字典
#{'_id': ObjectId('644e669857fdbcff71f7e3fe'), 'name': 'Mercedes', 'price': 79500, 'note': '备注'}

#直接根据ObjectId来查询,这里需要使用bson库里面的ObjectId。
from bson.objectid import ObjectId
result = col.find_one({'_id': ObjectId('644e669757fdbcff71f7e3fd')})
print(result)
#{'_id': ObjectId('644e669757fdbcff71f7e3fd'), 'name': 'Audi', 'price': 52142}

查询多条

#多条查询
#查询price低于60000的记录
results = col.find({'price':{'$lt': 60000}})
for i in results: #返回是集合,所以遍历
    print(i)
#{'_id': ObjectId('644e669757fdbcff71f7e3fd'), 'name': 'Audi', 'price': 52142}
# {'_id': ObjectId('644e669857fdbcff71f7e3ff'), 'name': 'Volvo', 'price': 29500, 'note': {'color': 'white', 'speed': '200'}}


#逻辑符号:查询price大于50000,同时name为Mercedes的记录
results = col.find({'$and':[{'price':{'$gt': 50000}},{'name':"Mercedes"}]})
for i in results: #返回是集合,所以遍历
    print(i)
#{'_id': ObjectId('644e669857fdbcff71f7e3fe'), 'name': 'Mercedes', 'price': 79500, 'note': '备注'}


#通过正则表达式查询name以A开头的记录
results = col.find({'name':{'$regex': '^A.*'}})
for i in results:
    print(i)
#{'_id': ObjectId('644e669757fdbcff71f7e3fd'), 'name': 'Audi', 'price': 52142}

计数

统计查询结果有多少条数据,col.find().count() 方法已被弃用,如果是所有数据条数,使用estimated_document_count(),如果是条件查询的数量,使用 count_documents。

#计数
#统计所有数据条数
count = col.estimated_document_count()
print(count)
#3

# #查询price低于60000的记录数量
count = col.count_documents({'price':{'$lt': 60000}})
print(count)
#2

排序

import pymongo

#排序,查询所有记录并按price逆序
results = col.find().sort('price', pymongo.DESCENDING)
print([i['price'] for i in results])
#[79500, 52142, 29500]

限制

#限制,只取前两个
results = col.find().sort('price', pymongo.DESCENDING).limit(2)
print([i['price'] for i in results])
#[79500, 52142]

具体符号的使用方式可在下边地址中进行查看!

符号官方地址:Query and Projection Operators — MongoDB Manual

比较符号:

逻辑符号:

功能符号:

2.4 pymongo 版本< 4.0 之异同

pymongo 版本介于 4.0 前后主要有以下两方面的区别:

① < 4.0 权限认证

client = pymongo.MongoClient("127.0.0.1", 27017)
admin = client.get_database("admin")   # 连接所需数据库
admin.authenticate("root", "root")

4.0 之前也可通过 authenticate 这个方法进行权限认证,4.0 之后就去掉了,和IP地址、端口放一起~

② < 4.0 插入数据

cars = [{'name': 'Mercedes', 'price': 57127},
        {'name': 'Volvo', 'price': 29000, 'note':{'color': 'white', 'speed':'200'}}]
col.insert(cars) #中括号(列表)包裹json文档

4.0 之前也可以使用 insert() 方法执行插入数据(单个+批量),但是 4.0 之后该方法就不再被支持了,只能使用 insert_one() 和 insert_many()。

② < 4.0 删除数据

result = col.remove({'name': 'Mercedes'})

4.0 之前也可以使用 remove() 方法执行删除数据(单个+批量),但是 4.0 之后该方法就不再被支持了,只能使用 delete_one() 和 delete_many()。

③ < 4.0 更新数据

#将pric高于60000的记录,price减500
condition = {'price': {'$gt':60000}}
result = col.update(condition, {'$inc': {'price': -500}})

4.0 之前也可以使用 update() 方法执行更新数据(单个+批量), 4.0 之后该方法就不再被支持了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/479853.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年华中杯选题人数公布

2023年华中杯选题人数公布 经过一晚上代码的编写&#xff0c;论文的写作&#xff0c;C题完整版论文已经发布&#xff0c; 注&#xff1a;蓝色字体为说明备注解释字体&#xff0c;不能出现在大家的论文里。黑色字体为论文部分&#xff0c;大家可以根据红色字体的注记进行摘抄。…

【STM32】知识补充 分频技术深度解析: 原理、应用与实现方法

【STM32】知识补充 分频技术深度解析: 原理、应用与实现方法 概述分频概念分频原理技术器分频器触发器分频器模数计数器分频器 分频应用微控制器时钟分频通信系统中的频率合成数字电路设计中的计时与同步 分频实现方法硬件分频器软件分频器 案例总结 概述 分频 (Frequency Div…

c#笔记-创建一个项目

创建一个项目 创建控制台程序 在你安装完成Visual Studio后打开它&#xff0c;你会的到一个启动窗口 点击创建新项目&#xff0c;选择右上角c#的没有Framework的控制台应用。 项目名称&#xff0c;位置自己随意。 目标框架选择NET7.0。 项目创建完成后应该你的界面应该类似…

nvdec与vaapi与vdpau的关系

nvdec/vaapi/vdpau的关系 NVDEC&#xff1a;nvidia video decoder。 英伟达官网中有关video codec SDK的介绍&#xff0c;其中有头文件、开发API文档等。 Nvidia Video SDK中提供了NVDEC、NVENC&#xff0c;其中NVDEC以前也叫做NVCUVID&#xff08;不知道NVDEC的开发API中很…

【9.HTML入门知识-其他知识补充】

其他知识补充 1.使用Web字体和图标1.1 web fonts兼容性写法1.2 字体图标1.2.1 字体图标的使用 2.精灵图 CSS Sprite2.1 精灵图的使用 3.置鼠标指针&#xff08;光标&#xff09;样式cusor4.居中方案4.1 使用绝对定位元素居中 1.使用Web字体和图标 1.1 web fonts兼容性写法 1.2 …

软件开发团队的护网低成本应对方案

主题&#xff1a; 1、攻击方技术手段说明&#xff0c;结合攻击队手段重点关注的防御点介绍&#xff1b; 2、防守方&#xff08;软件开发团队&#xff09;的低成本应对思路&#xff1b;系统是如何被攻破的 攻防演练&#xff08;APT&#xff09;攻击路径 未知攻&#xff0c;焉知…

IGH EtherCAT主站应用层代码开发:控制驱动电机

1、安装IGH EtherCAT主站 Ubuntu18.04环境下安装igH EtherCAT Master 2、查询从站配置信息 连接从站通过网线连接主站与从站 启动主站打开终端,输入: sudo /etc/init.d/ethercat star 显示Starting EtherCAT master 1.5.2 done则说明成功。 查询从站列表终端输入: eth…

【C++】 list-map 链表与映射表的简单使用

目录 list 链表 定义链表&#xff0c;并在首、尾添加、删除元素 迭代器遍历链表 任意位置插入或删除 获取首尾节点中元素的值 使用增强的范围for循环进行遍历链表 其他常见的函数 map 映射表 定义map 添加 使用函数插入元素 迭代器遍历map 修改 删除 使用增强的范…

PMP项目管理-[第七章]成本管理

成本管理知识体系&#xff1a; 规划成本管理&#xff1a; 估算成本&#xff1a; 制定预算&#xff1a; 控制成本&#xff1a; 7.1 挣值管理新兴实践 ps&#xff1a;了解即可&#xff0c;考试考不到 7.2 规划成本管理 定义&#xff1a;确定如何估算、预算、管理、监督和控制项目…

直接插入排序

一、概念及其介绍 插入排序(InsertionSort)&#xff0c;一般也被称为直接插入排序。 对于少量元素的排序&#xff0c;它是一个有效的算法。插入排序是一种最简单的排序方法&#xff0c;它的基本思想是将一个记录插入到已经排好序的有序表中&#xff0c;从而一个新的、记录数增…

你是否曾经为自己写的代码而感到懊恼?那如何才能写出高质量代码呢?

这里写目录标题 一、 前言二、高质量代码的特征三、编程实践技巧1. 遵循编码规范2. 使用有意义的变量名和函数名3. 减少代码重复4. 使用注释5. 编写单元测试6. 使用设计模式7. 使用版本控制工具8. 保持代码简洁9. 优化代码性能10. 学习和借鉴他人的代码总结 一、 前言 写出高质…

Python入门教程+项目实战-11.5节: 程序实战-选择排序算法

目录 11.5.1 排序算法简介 11.5.2 选择排序算法 11.5.3 系统学习python 11.5.1 排序算法简介 所谓排序&#xff0c;是指将数据集合中的元素按从小到大的顺序进行排列&#xff0c;或按从大到小的顺序进行排列。前者称为升序排序&#xff0c;后者称为降序排序。在数据结构与算…

ChatGPT会颠覆SEO内容创作吗

近几年 AI 的发展日新月异。除了搜索算法本身大规模应用人工智能&#xff0c;我也一直关注着 AI 用于写作的进展。 上篇关于 Google 有用内容更新的帖子还在说&#xff0c;高质量内容创作是 SEO 最难的事之一&#xff0c;对某些网站来说&#xff0c;如果能有工具帮助&#xff…

python毕业设计之django+vue.js幼儿园网站系统

开发语言&#xff1a;Python 框架&#xff1a;django Python版本&#xff1a;python3.7.7 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat 开发软件&#xff1a;PyCharm 采用了Windows10操作系统平台&#xff0c;使用HTMLCSSJS前端模板django作为后台监控&#xff0…

大数据Doris(九):Apache Doris 简单使用

文章目录 Apache Doris 简单使用 一、用户创建 二、创建数据库 三、账户赋权 四、创建数据表 1、创建数据表 2、准备数据 3、导入数据 五、查询数据表 Apache Doris 简单使用 下面按照官网给出的示例简单操作Doris&#xff0c;首先创建用户、创建数据库、赋权、创建表…

第二弹进阶吴恩达 ChatGPT Prompt 技巧

第一弹笔记在这里&#xff1a; 总结吴恩达 ChatGPT Prompt 免费课程 今天分享第二弹&#xff0c;进阶篇。 第一点&#xff0c;任务序列化。 通常看完一篇长文&#xff0c;脑子里往往充满无数疑问。急切想知道所有答案&#xff0c;必须列一个问题清单。对话式问法&#xff0c;对…

ChatGPT:数字时代革新与展望

ChatGPT&#xff1a;数字时代革新与展望 AGI 未来的愿景&#xff1a;建安全有益的 AGI OpenAI团队对AGI的展望&#xff1a; 我们希望 AGI 能够赋予人类在宇宙中最大程度地繁荣发展的能力。我们不期望未来是一个不合格的乌托邦&#xff0c;但我们希望将好的最大化&#xff0c;将…

vue使用路由的query配置项时如何清除地址栏的参数

写vue项目时&#xff0c;如果想通过路由的query配置项把参数从一个组件传到另一个组件&#xff0c;但是又不希望?idxxx显示在地址栏&#xff08;如&#xff1a;http://localhost:8080/test?idxxx的?idxxx&#xff09;&#xff0c;该怎么做&#xff1a; 举一个案例&#xff1…

【Python】【进阶篇】18、Django初始化项目环境精讲

目录 18、Django初始化项目环境精讲1. 完成数据库迁移2. PyMySQL模块的使用3. migrate与makemigrations命令详解1) makegrations生成数据库迁移文件2) migrate执行数据库迁移命令3) 完成数据库迁移总结 18、Django初始化项目环境精讲 上一节中&#xff0c;我们完成了对 settin…

软件工程导论 - 了解黑盒测试

前言 本篇介绍用例的基本要素&#xff0c;熟悉黑盒测试的7种设计测试用例的方法&#xff0c;了解等价类&#xff0c;边界值&#xff0c;判定表&#xff0c;正交表&#xff0c;场景设计&#xff0c;错误猜测法&#xff1b;如有错误&#xff0c;请在评论区指正&#xff0c;让我们…