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中pywin32 常用窗口操作的实现

《Python中pywin32常用窗口操作的实现》本文主要介绍了Python中pywin32常用窗口操作的实现,pywin32主要的作用是供Python开发者快速调用WindowsAPI的一个... 目录获取窗口句柄获取最前端窗口句柄获取指定坐标处的窗口根据窗口的完整标题匹配获取句柄根据窗口的类别匹配获取句

利用Python打造一个Excel记账模板

《利用Python打造一个Excel记账模板》这篇文章主要为大家详细介绍了如何使用Python打造一个超实用的Excel记账模板,可以帮助大家高效管理财务,迈向财富自由之路,感兴趣的小伙伴快跟随小编一... 目录设置预算百分比超支标红预警记账模板功能介绍基础记账预算管理可视化分析摸鱼时间理财法碎片时间利用财

Python中的Walrus运算符分析示例详解

《Python中的Walrus运算符分析示例详解》Python中的Walrus运算符(:=)是Python3.8引入的一个新特性,允许在表达式中同时赋值和返回值,它的核心作用是减少重复计算,提升代码简... 目录1. 在循环中避免重复计算2. 在条件判断中同时赋值变量3. 在列表推导式或字典推导式中简化逻辑

python处理带有时区的日期和时间数据

《python处理带有时区的日期和时间数据》这篇文章主要为大家详细介绍了如何在Python中使用pytz库处理时区信息,包括获取当前UTC时间,转换为特定时区等,有需要的小伙伴可以参考一下... 目录时区基本信息python datetime使用timezonepandas处理时区数据知识延展时区基本信息

Python位移操作和位运算的实现示例

《Python位移操作和位运算的实现示例》本文主要介绍了Python位移操作和位运算的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 位移操作1.1 左移操作 (<<)1.2 右移操作 (>>)注意事项:2. 位运算2.1

使用Python和Pyecharts创建交互式地图

《使用Python和Pyecharts创建交互式地图》在数据可视化领域,创建交互式地图是一种强大的方式,可以使受众能够以引人入胜且信息丰富的方式探索地理数据,下面我们看看如何使用Python和Pyec... 目录简介Pyecharts 简介创建上海地图代码说明运行结果总结简介在数据可视化领域,创建交互式地

利用python实现对excel文件进行加密

《利用python实现对excel文件进行加密》由于文件内容的私密性,需要对Excel文件进行加密,保护文件以免给第三方看到,本文将以Python语言为例,和大家讲讲如何对Excel文件进行加密,感兴... 目录前言方法一:使用pywin32库(仅限Windows)方法二:使用msoffcrypto-too

使用Python实现矢量路径的压缩、解压与可视化

《使用Python实现矢量路径的压缩、解压与可视化》在图形设计和Web开发中,矢量路径数据的高效存储与传输至关重要,本文将通过一个Python示例,展示如何将复杂的矢量路径命令序列压缩为JSON格式,... 目录引言核心功能概述1. 路径命令解析2. 路径数据压缩3. 路径数据解压4. 可视化代码实现详解1

python获取网页表格的多种方法汇总

《python获取网页表格的多种方法汇总》我们在网页上看到很多的表格,如果要获取里面的数据或者转化成其他格式,就需要将表格获取下来并进行整理,在Python中,获取网页表格的方法有多种,下面就跟随小编... 目录1. 使用Pandas的read_html2. 使用BeautifulSoup和pandas3.

Python装饰器之类装饰器详解

《Python装饰器之类装饰器详解》本文将详细介绍Python中类装饰器的概念、使用方法以及应用场景,并通过一个综合详细的例子展示如何使用类装饰器,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录1. 引言2. 装饰器的基本概念2.1. 函数装饰器复习2.2 类装饰器的定义和使用3. 类装饰