python 之pymongo的CURD

2024-03-12 16:12
文章标签 python pymongo curd

本文主要是介绍python 之pymongo的CURD,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • pymongo的基本操作
    • 前言
    • 新增
      • 1、新增一条记录
      • 2、新增多条记录
      • 3、自定义_id 的新增
    • 更新
      • 1、更新一条记录
      • 2、更新多条记录
    • 删除
      • 删除一条记录
      • 删除多条记录
    • 查询
      • 条件查询
      • 根据运算符查询
      • 根据范围查找
      • 根据正则表达式查询
      • 投影
      • 排序
      • 分页查询
    • 管道聚合

pymongo的基本操作

前言

前面有了 mongodb命令操作学习 以及 pymongo单例连接池的学习,
接下来就学习pymongo 的增删查改操作,具体源码地址:https://gitee.com/allen-huang/python/blob/master/python-code/do-mongodb/test_curd.py

新增

1、新增一条记录

  • 格式:
集合.insert_one(<字典结构>)
  • 测试用例代码
def test_insert_one(self):"""单条插入数据@return:"""insert_data = {"uid": 1,"name": "0001","real_name": "黄飞鸿","email": "000@sina.cn","age": 30,"sex": 1,}res = MongoPool().test.user.insert_one(insert_data)print(res.inserted_id)pass

2、新增多条记录

  • 格式:
集合.insert_one(<列表结构>)
  • 测试用例代码:
def test_insert_many(self):"""批量插入数据@return:"""user_list = [{"uid": 2, "name": "0002", "real_name": "张三", "email": "001@sina.cn", "age": 29, "sex": 1},{"uid": 3, "name": "0003", "real_name": "魏延", "email": "002@sina.cn", "age": 28, "sex": 1},{"uid": 4, "name": "0004", "real_name": "刘备", "email": "003@sina.cn", "age": 38, "sex": 1},{"uid": 5, "name": "0005", "real_name": "关羽", "email": "004@sina.cn", "age": 32, "sex": 1},{"uid": 6, "name": "0006", "real_name": "张飞", "email": "005@sina.cn", "age": 33, "sex": 1},{"uid": 7, "name": "0007", "real_name": "赵云", "email": "006@sina.cn", "age": 21, "sex": 1},{"uid": 8, "name": "0008", "real_name": "马超", "email": "007@sina.cn", "age": 22, "sex": 1},{"uid": 9, "name": "0009", "real_name": "黄忠", "email": "008@sina.cn", "age": 24, "sex": 1},{"uid": 10, "name": "0010", "real_name": "孙尚香", "email": "009@sina.cn", "age": 28, "sex": 2},{"uid": 11, "name": "0011", "real_name": "黄月英", "email": "0010@sina.cn", "age": 27, "sex": 2},{"uid": 12, "name": "0012", "real_name": "诸葛亮", "email": "0011@sina.cn", "age": 29, "sex": 1},]res = MongoPool().test.user.insert_many(user_list)print(res.inserted_ids)pass

3、自定义_id 的新增

def test_insert_custom_ids(self):"""批量插入数据,自定义_id@return: """ids_list = [{"_id": 1, "name": "曹操"},{"_id": 2, "name": "曹丕"},{"_id": 3, "name": "典韦"},{"_id": 4, "name": "许诸"}]res = MongoPool().test.user_ids.insert_many(ids_list)print(res.inserted_ids)pass

更新

1、更新一条记录

  • 格式:
    第三个参数 upsert=True 表示存在更新,不存在就新增
集合.update_one(filter=<更新条件>,
update=<更新的数据属于字典结构>,
upsert=True|False
)
  • 不带 upsert测试用例代码:
def test_update_one(self):"""更新一条记录@return: """# 更新条件condition = {"uid": 5}# 更新的数据update_data = {"email": "0004@163.com"}res = MongoPool().test.user.update_one(filter=condition, update={"$set": update_data})print(res.modified_count)pass
  • 带上 upsert测试用例代码:
def test_update_upsert(self):"""更新一条记录,存在更新,不存在新增@return:"""# 更新的数据update_data = {"uid": 13,"name": "0013","real_name": "铁桥三","email": "013sina.cn","age": 27,"sex": 1,}# 更新条件condition = {"uid": 13}# 更新的选项,存在更新,不存在新增upsert_option = Trueres = MongoPool().test.user.update_one(filter=condition, update={"$set": update_data}, upsert=upsert_option)print(res)pass

2、更新多条记录

  • 格式:

格式和更新一条数据差不多

集合.update_many(filter=<更新条件>,
update=<更新的数据属于字典结构>,
upsert=True|False
)
  • 测试用例1:
def test_update_many(self):"""更新多条记录,更新年龄大于30岁的人,武力值更新为95@return:"""# 更新的数据update_data = {"$set": {"force_value": 95}}# 更新条件condition = {"age": {"$gt": 30}}# 更新选项,存在更新,不存在就新增upsert_option = Trueres = MongoPool().test.user.update_many(filter=condition, update=update_data, upsert=upsert_option)print(res)pass
  • 测试用例2:
def test_update_many_init(self):"""更新多条记录,筛选出name包含000的人员,武力值更新为90,初始化登录次数@return:"""# 更新的数据,$setOnInsert类似新增数据后进行初始化操作update_data = {"$set": {"force_value": 90}, "$setOnInsert": {"login_nums": 1}}# 更新条件condition = {"name": {"$regex": "^000"}}# 更新选项,存在更新,不存在就新增upsert_option = Trueres = MongoPool().test.user.update_many(filter=condition, update=update_data, upsert=upsert_option)print(res)pass

删除

删除一条记录

  • 格式:
集合.delete_one(<删除条件>)
  • 测试用例
def test_delete_one(self):"""删除单条数据@return:"""res = MongoPool().test.user.delete_one({'uid': 1})print(res.deleted_count)

删除多条记录

  • 格式:
集合.delete_many(<删除条件>)
  • 测试用例
def test_delete_many(self):"""批量删除uid<=2的记录@return:"""condition = {"uid": {"$lte": 2}}res = MongoPool().test.user.delete_many(condition)print(res)

查询

查询涉及到条件,运算符,正则表达式查询,排序,投影(查询部分字段)
find_one([查询条件]) 查询一条记录
find([查询条件]) 查询多条记录

条件查询

  • 单个条件
def test_find_one(self):"""查询一条数据@return:"""coll = MongoPool().test.userdata = coll.find_one({"uid": 1})print(data)pass
  • 多个条件
def test_find_more_filter(self):"""查询sex=1,年龄大于30岁的数据@return: """coll = MongoPool().test.userdata_list = coll.find({"sex": 1, "age": {"$gte": 30}})for data in data_list:print(data)

根据运算符查询

  • 大于
def test_find_gt(self):"""查询age大于30岁的数据@return:"""coll = MongoPool().test.userdata_list = coll.find({"age": {"$gt": 30}})for data in data_list:print(data["uid"])
  • 大于等于
def test_find_gte(self):"""查询 age 大于等于35岁的数据@return:"""data_list = MongoPool().test.user.find({"age": {"$gte": 35}})for data in data_list:print(data["real_name"])
  • 小于
def test_find_lt(self):"""查询 age 小于30岁的数据@return:"""data_list = MongoPool().test.user.find({"age": {"$lt": 30}})for data in data_list:print(data)
  • 小于等于
def test_find_lte(self):"""查询 age 小于等于27岁的数据@return:"""data_list = MongoPool().test.user.find({"age": {"$lte": 27}})for data in data_list:print(data)
  • 不等于
def test_find_ne(self):"""查询sex!=1的数据@return:"""coll = MongoPool().test.userdata_list = coll.find({"sex": {"$ne": 1}})for data in data_list:print(data)

根据范围查找

  • 数字范围start<=num<=end
def test_find_between(self):"""查询 age 在 20到25 之间的数据@return:"""data_list = MongoPool().test.user.find({"age": {"$gte": 20, "$lte": 25}})for data in data_list:print(data)
  • 数组范围
def test_find_range(self):"""范围查找,指定 uid来查找@return:"""data_list = MongoPool().test.user.find({"uid": {"$in": [1, 2, 4, 5]}})for data in data_list:print(data)

根据正则表达式查询

  • 类似 mysql 的 like 查找
def test_find_like(self):"""查询 name 包含 000的数据,类似mysql like这和mongodb的shell命令行不同,mongodb 的 shell 命令行是/000/"""data_list = MongoPool().test.user.find({"name": {"$regex": "000"}})for data in data_list:print(data)
  • 以某个字符串开头
def test_find_pos(self):"""查找邮箱以某个字符串001开头的数据@return:"""data_list = MongoPool().test.user.find({"email": {"$regex": "^001"}})for data in data_list:print(data)
  • 以某个字符串结尾
def test_find_rpos(self):"""查找邮箱以某个字符串163.com结尾的数据@return:"""data_list = MongoPool().test.user.find({"email": {"$regex": "163.com$"}})for data in data_list:print(data)

投影

投影是查询若干个字段,不是所有字段的数据

def test_find_projection(self):"""查询数据,只返回uid,real_name,age,sex@return:"""# 筛选条件filter = {"age": {"$lte": 25}}# 字段_id 不显示,uid,real_name,age,sex显示data_list = MongoPool().test.user.find(filter).project({"_id": 0, "uid": 1, "real_name": 1, "age": 1, "sex": 1})for data in data_list:print(data)

排序

在MongoDB中对结果进行排序,可使用sort()方法。
该方法接受一个包含字段列表及其排序顺序的参数,要指定排序顺序,使用1和-1,1用于升序,-1用于降序。

  • 格式:
集合.find([查询条件]).sort({KEY:1})
  • 示例代码
def test_find_sort(self):"""查找 sex=1,按年龄降序排序@return:"""coll = MongoPool().test.userdata_list = coll.find({"sex": 1}).sort({"age": -1})for data in data_list:print(data)

分页查询

mongodb 分页是使用 skip 和 limit来进行分页

def test_find_page(self):"""分页查找@return:"""coll = MongoPool().test.userpage_size = 10page_num = 1skip_num = (page_num - 1) * page_sizedata_list = coll.find().sort({"age": -1}).skip(skip_num).limit(page_size)for data in data_list:print(data)

管道聚合

待续…

这篇关于python 之pymongo的CURD的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/801829

相关文章

Python判断for循环最后一次的6种方法

《Python判断for循环最后一次的6种方法》在Python中,通常我们不会直接判断for循环是否正在执行最后一次迭代,因为Python的for循环是基于可迭代对象的,它不知道也不关心迭代的内部状态... 目录1.使用enuhttp://www.chinasem.cnmerate()和len()来判断for

使用Python实现高效的端口扫描器

《使用Python实现高效的端口扫描器》在网络安全领域,端口扫描是一项基本而重要的技能,通过端口扫描,可以发现目标主机上开放的服务和端口,这对于安全评估、渗透测试等有着不可忽视的作用,本文将介绍如何使... 目录1. 端口扫描的基本原理2. 使用python实现端口扫描2.1 安装必要的库2.2 编写端口扫

使用Python实现操作mongodb详解

《使用Python实现操作mongodb详解》这篇文章主要为大家详细介绍了使用Python实现操作mongodb的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、示例二、常用指令三、遇到的问题一、示例from pymongo import MongoClientf

使用Python合并 Excel单元格指定行列或单元格范围

《使用Python合并Excel单元格指定行列或单元格范围》合并Excel单元格是Excel数据处理和表格设计中的一项常用操作,本文将介绍如何通过Python合并Excel中的指定行列或单... 目录python Excel库安装Python合并Excel 中的指定行Python合并Excel 中的指定列P

一文详解Python中数据清洗与处理的常用方法

《一文详解Python中数据清洗与处理的常用方法》在数据处理与分析过程中,缺失值、重复值、异常值等问题是常见的挑战,本文总结了多种数据清洗与处理方法,文中的示例代码简洁易懂,有需要的小伙伴可以参考下... 目录缺失值处理重复值处理异常值处理数据类型转换文本清洗数据分组统计数据分箱数据标准化在数据处理与分析过

Python调用另一个py文件并传递参数常见的方法及其应用场景

《Python调用另一个py文件并传递参数常见的方法及其应用场景》:本文主要介绍在Python中调用另一个py文件并传递参数的几种常见方法,包括使用import语句、exec函数、subproce... 目录前言1. 使用import语句1.1 基本用法1.2 导入特定函数1.3 处理文件路径2. 使用ex

Python脚本实现自动删除C盘临时文件夹

《Python脚本实现自动删除C盘临时文件夹》在日常使用电脑的过程中,临时文件夹往往会积累大量的无用数据,占用宝贵的磁盘空间,下面我们就来看看Python如何通过脚本实现自动删除C盘临时文件夹吧... 目录一、准备工作二、python脚本编写三、脚本解析四、运行脚本五、案例演示六、注意事项七、总结在日常使用

Python将大量遥感数据的值缩放指定倍数的方法(推荐)

《Python将大量遥感数据的值缩放指定倍数的方法(推荐)》本文介绍基于Python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处理,并将所得处理后数据保存为新的遥感影像... 本文介绍基于python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处

python管理工具之conda安装部署及使用详解

《python管理工具之conda安装部署及使用详解》这篇文章详细介绍了如何安装和使用conda来管理Python环境,它涵盖了从安装部署、镜像源配置到具体的conda使用方法,包括创建、激活、安装包... 目录pytpshheraerUhon管理工具:conda部署+使用一、安装部署1、 下载2、 安装3

Python进阶之Excel基本操作介绍

《Python进阶之Excel基本操作介绍》在现实中,很多工作都需要与数据打交道,Excel作为常用的数据处理工具,一直备受人们的青睐,本文主要为大家介绍了一些Python中Excel的基本操作,希望... 目录概述写入使用 xlwt使用 XlsxWriter读取修改概述在现实中,很多工作都需要与数据打交