python使用mongo操作

目前有个需求,就是把所有sql转为mongo管道查询

知识点

在 MongoDB 中,allowDiskUse 选项应该作为聚合命令的一个选项,而不是聚合管道的一个阶段。allowDiskUse 选项用于允许聚合操作使用磁盘空间来临时存储数据(当聚合操作的数据集非常大,无法在内存中完全处理时)。

$group 阶段:

这个阶段按照 province 字段的值对数据进行分组。
对于每个分组(即每个省份),它会收集所有不同的 $sha1 字段值,并将它们放入一个集合(set)中,因为这个阶段使用了 $addToSet 累加器。由于集合(set)中的元素是唯一的,所以每个 $sha1 值只会被添加到集合中一次。
这个集合被存储在新的 cert_count 字段中,但实际上它包含了 $sha1 的值,而不是真正的“证书数量”。

$addFields 阶段:

这个阶段是对上一阶段输出文档的一个处理。
它使用了 $size 表达式来计算 cert_count 字段(实际上是一个集合)中的元素数量,并将结果仍然保存在 cert_count 字段中。
经过这个阶段后,cert_count 字段现在包含了每个省份中不同的 $sha1 值的数量。虽然名称还是 cert_count,但现在它实际上表示的是每个省份中不同 $sha1 值的数量,而不是直接的“证书数量”。

需求一:目前的需求是根据省份分组求唯一证书的数量,所以需要去重

原有sql
省:证书 分组统计

     query = f"""SELECT province, COUNT(DISTINCT(sha1)) AS cert_countFROM {cls.table_name}Group BY provinceORDER BY cert_count DESC"""

去重前

db.cert_info.aggregate([{  '$group': {  '_id': '$province',  'cert_count': {  '$sum': 1  }  }  
},{'$sort': {'cert_count': - 1}},{'$limit': 10}
], {allowDiskUse: true
})

结果
在这里插入图片描述

去重后

第一种写法:

db.cert_info.aggregate([  {  '$group': {  '_id': {  'province': '$province',  'sha1': '$sha1'  },  // 由于我们只需要去重计数,所以这里不需要额外的累加器  // 我们只是简单地按 province 和 sha1 组合进行分组  }  },  {  '$group': {  '_id': '$_id.province', // 按 province 重新分组  'cert_count': {  '$sum': 1 // 计算每个 province 的唯一 sha1 的数量  }  }  },  {  '$sort': {  'cert_count': -1 // 按证书数量降序排序  }  },  {  '$limit': 10 // 限制结果集大小为 10  }  
], {  allowDiskUse: true // 允许聚合操作使用磁盘空间  
});

结果
在这里插入图片描述

第二种写法:

db.cert_info.aggregate([{'$group': {'_id': '$province','cert_count': {'$addToSet': '$sha1'}}},{'$addFields': {'cert_count': {'$size': '$cert_count'}}},{'$sort': {'cert_count': - 1}},{'$limit': 10}
], {allowDiskUse: true
})

查询结果
在这里插入图片描述

需求二:按照行业分组,统计唯一证书数量,过滤掉其他和未知的行业

原有sql

 query = f"""SELECT yb_industry, COUNT(DISTINCT(sha1)) AS cert_countFROM {cls.table_name}WHERE yb_industry NOT IN ['其他','未知']Group BY yb_industryORDER BY cert_count DESC"""

mongo

db.cert_info.aggregate([{'$match': {'yb_industry': {'$nin': ['其他', '未知']  }}},{'$group': {'_id': '$yb_industry',  'cert_count': {'$addToSet': '$sha1'  }}},{'$addFields': {'cert_count': {'$size': '$cert_count'  }}},{'$sort': {'cert_count': -1  }},{'$limit': 10}], {allowDiskUse: true})

在这里插入图片描述

再加个省份分组

province_pipeline = [{'$match': {'domestic': True,'yb_industry': {'$nin': ['其他', '未知']}}},{'$addFields': {'province_temp': '$province'}},{'$group': {'_id': {'yb_industry': '$yb_industry','province': '$province_temp'},'sha1_set': {'$addToSet': '$sha1'}}},{'$addFields': {'province': '$_id.province','cert_count': {'$size': {'$setUnion': ['$sha1_set', []]}}}},{'$sort': {'cert_count': -1}},{'$project': {'_id': 0,'yb_industry': '$_id.yb_industry','province': '$_id.province','cert_count': 1}}]

查询的时候按照省份过滤,取top10

# 使用filter函数过滤data列表filtered_data = list(filter(lambda item: item['province'] == province, data))top10_data = filtered_data[:10]return Response(top10_data)

需求三:查询过期的证书

原有sql

SELECT province, COUNT(DISTINCT(sha1)) AS cert_countFROM {cls.table_name}WHERE end < NOW()Group BY provinceORDER BY cert_count DESC

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

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

相关文章

力扣顺序表思路讲解

本篇文章&#xff0c;我给大家带来的是顺序表题目讲解&#xff0c;希望大家看完有所收获&#xff0c;废话不多说&#xff0c;我们现在开始 审题 大白话&#xff1a;给了一个数组和一个目标值。如果数组里的两个元素相加 目标值&#xff0c;则返回这两个元素的下标。那么大家需…

java编程中,实现分页对象的类型转换

一、背景 当数据库分页查询返回的对象与接口要返回的对象类型不一致时&#xff0c;不可避免需要进行类型转换。 示例&#xff1a;数据库分页查询返回的对象是PageDTO&#xff0c;而接口返回的对象类型是PageVO。 PageDTO Data public class PageDTO<T> {/*** Current…

Python专题:一、安装步骤

1、下载地址&#xff1a;Welcome to Python.org 勾选这个add 其他的全部下一步即可。 运行出现这个即代表安装成功。 Python自带编辑器。 2、推荐使用的sublime 编辑器下载 全部下一步安装。

C++ 函数与指针

函数内部数据是地址需要传递给调用函数&#xff0c;返回的当然是指针了&#xff01;当然&#xff0c;这个返回地址也可以通过函数参数返回&#xff01; 函数的参数是指针可以输出函数多个结果&#xff0c;返回值本身就是返回数据&#xff0c;什么时候需要返回指针呢&#xff1f…

5.6代码

1.最大公约数 这个题最重要的是要找到一个区间是1&#xff0c;找到之后就可以直接加次数就可以了 #include <bits/stdc.h>using namespace std;main() {long long n,i,j,a0,b,ans99999;cin>>n;long long s[n],dp[n][n];for(i0;i<n;i){cin>>s[i];if(s[i]1…

shell常用文件处理命令

1. 解压 1.1 tar 和 gz 文件 如果你有一个 .tar 文件,你可以使用以下命令来解压: tar -xvf your_file.tar在这个命令中,-x 表示解压缩,-v 表示详细输出(可选),-f 后面跟着要解压的文件名。 如果你的 .tar 文件同时被 gzip 压缩了(即 .tar.gz 文件),你可以使用以下…

黑马程序员HarmonyOS4+NEXT星河版入门到企业级实战教程笔记

HarmonyOS NEXT是纯血鸿蒙&#xff0c;鸿蒙原生应用&#xff0c;彻底摆脱安卓 本课程是基于harmony os4的&#xff0c;与next仅部分api有区别 套件 语言&框架 harmony os design ArkTs 语言 ArkUI 提供各种组件 ArkCompiler 方舟编译器 开发&测试 DevEco Studio 开发…

Vue3工程化配置

Vue3工程化配置 目录 Vue3工程化配置创建项目vue-clivite(推荐) 快速体验2和3的差别vue3vue2 ref和reactive 创建项目 vue-cli 具体环境配置请点这里 记得新建配置时这里选vue3 vite(推荐) 注&#xff1a;Vite 需要 Node.js 版本 18&#xff0c;20 1.选定路径后再cmd输入创建…

免费在线录屏、无需注册、免费可用、无限制

免费在线工具 https://orcc.online/ 在线录屏 https://orcc.online/recorder pdf在线免费转word文档 https://orcc.online/pdf 时间戳转换 https://orcc.online/timestamp Base64 编码解码 https://orcc.online/base64 URL 编码解码 https://orcc.online/url Hash(MD5/SHA…

羊大师解读,当代年轻人焦虑应对指南

羊大师解读&#xff0c;当代年轻人焦虑应对指南 当代年轻人面临焦虑问题时&#xff0c;羊大师提出以下综合建议&#xff0c;要增强自我认知了解自身的需求和期望&#xff0c;明确自己的价值观和目标。这有助于避免盲目跟风和过度比较&#xff0c;从而减轻不必要的焦虑。 合理规…

apk反编译修改教程系列---修改指定apk 让其开机自动打开运行【十四】

通过前面的几期反编译apk的博文 。应该初步了解反编译apk的一些常识和简单的修改步骤。在与有些工作室合作中。一些客户需要安卓机型开机自动打开运行指定的apk。这类需求常规我们都先要检查apk有没有加密 加固。然后对应修改其中的代码。今天以一款apk实例步骤演示修改的过程 …

企业怎样进行IT外包以及IT外包服务内容

在数字化时代的浪潮中&#xff0c;企业逐渐认识到信息技术的关键作用&#xff0c;特别是制造业基地对于IT外包和运维服务的需求持续增长。然而&#xff0c;在诸多可供选择的IT外包和运维方案中&#xff0c;企业如何推动与IT外包公司的合作&#xff1f;本文将深入介绍IT外包方案…

探索大型语言模型在信息提取中的应用与前景

随着人工智能技术的快速发展&#xff0c;大型语言模型&#xff08;LLMs&#xff09;在自然语言处理&#xff08;NLP&#xff09;领域取得了显著的进展。特别是在信息提取&#xff08;IE&#xff09;任务中&#xff0c;LLMs展现出了前所未有的潜力和优势。信息提取是从非结构化文…

跨考专业课142分,上岸重邮!

这个系列会邀请上岸学长学姐进行经验分享~ 今天分享经验的同学是我的“关门弟子”&#xff0c;小叮当&#xff0c;跨考上岸重邮通信工程&#xff01;从平时和小叮当的交流和测试&#xff0c;就能看出专业课水平&#xff0c;我一直和她开玩笑说&#xff0c;早点遇到我&#xff…

如果你作 为Java程序员曾经遭遇过NullPointerException,请举起手

如果你作 为Java程序员曾经遭遇过NullPointerException&#xff0c;请举起手 1.让Optional发光发热&#xff1a;去除代码中对null的检查&#xff0c; 采用防御式检查减少NullPointerException java8实战 书籍 第225页 免费下载链接&#xff1a; https://pan.quark.cn/s/5cf68…

GEE数据集——DeltaDTM 全球沿海数字地形模型数据集

DeltaDTM 全球沿海数字地形模型产品 简介 DeltaDTM 是全球沿岸数字地形模型&#xff08;DTM&#xff09;&#xff0c;水平空间分辨率为 1 弧秒&#xff08;∼30 米&#xff09;&#xff0c;垂直平均绝对误差&#xff08;MAE&#xff09;为 0.45 米。它利用 ICESat-2 和 GEDI …

react引入阿里矢量库图标

react引入阿里矢量库图标 登录阿里矢量库&#xff0c;将项目所需的图标放一起 react项目中新建文件夹MyIcon.js 3. 在页面中引入&#xff0c;其中type为图标名称

定时任务的几种实现方式

定时任务实现的几种方式&#xff1a; 1、JDK自带 &#xff08;1&#xff09;Timer&#xff1a;这是java自带的java.util.Timer类&#xff0c;这个类允许你调度一个java.util.TimerTask任务。使用这种方式可以让你的程序按照某一个频度执行&#xff0c;但不能在指定时间运行。…

Unreal游戏GPU参数详解,游戏性能优化再升级

UWA GOT Online For Unreal GPU模式近期全新发布&#xff0c;方便开发者从渲染和带宽的角度进行GPU分析。同时&#xff0c;此次更新中UWA也增加了丰富的GPU参数&#xff0c;涵盖了GPU SoC和GPU Counter模块。这些新增的参数不仅能够帮助Unreal开发者从宏观层面监控GPU的压力状况…

Python爬虫--Urllib基础

1. urlretrieve Urllib 库也是类似 request 库&#xff0c;用来解析html的 首先讲 urlretrieve 子模块 这个模块的作用是将网页下载到本地 语法&#xff1a; urlretrieve(网址,本地地址) 例如&#xff1a; 这样就可以了&#xff0c;他会将百度网页下载到本地D盘下&#x…