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_count
                        FROM {cls.table_name}
                        Group BY province
                        ORDER 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_count
                    FROM {cls.table_name}
                    WHERE yb_industry NOT IN ['其他','未知']
                    Group BY yb_industry
                    ORDER 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_count
                       FROM {cls.table_name}
                       WHERE end < NOW()
                       Group BY province
                       ORDER BY cert_count DESC

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[leetcode] 67. 二进制求和

文章目录 题目描述解题方法模拟java代码复杂度分析 相似题目 题目描述 给你两个二进制字符串 a 和 b &#xff0c;以二进制字符串的形式返回它们的和。 示例 1&#xff1a; 输入:a "11", b "1" 输出&#xff1a;"100"示例 2&#xff1a; 输…

串的模式匹配之KMP算法实现

概述 函数刻画 主串位置不变&#xff0c;next值就是模式串(子串)比较后应跳转的位置 不同位置 next[j]函数 next由模式串决定&#xff0c;看模式串当前比较位的前串中前后缀相同的个数来得k-1的值&#xff0c;next[当前位]k1 小补充 PM值&#xff1a;也称部分匹配值&#xf…

产品推荐 | 基于Intel (Altera) Cyclone V打造的水星Mercury SA1核心板

01 产品概述 水星Mercury SA1片上系统&#xff08;SoC&#xff09;核心板通过结合基于ARM处理器的SoC FPGA、快速DDR3L SDRAM、eMMC flash、QSPI flash、Gigabit Ethernet PHY和RTC形成了一个高性能嵌入式处理方案&#xff0c;结合了CPU系统的灵活性和FPGA原始的、实时的并行处…

EXCEL——VLOOKUP函数

一、VLOOKUP函数的语法 VLOOKUP(lookup_value,table_array,col_index_num,[range_lookup]) lookup_value 需要在数据表首列进行搜索的值&#xff0c;可以是数值&#xff0c;引用或字符串 table_array 要在其中搜索数据的文字、数字或逻辑值表&#xff0c;可以是对区域或…

自动化测试再升级,大模型与软件测试相结合

近年来&#xff0c;软件行业一直在迅速发展&#xff0c;为了保证软件质量和提高效率&#xff0c;软件测试领域也在不断演进。如今&#xff0c;大模型技术的崛起为软件测试带来了前所未有的智能化浪潮。 软件测试一直是确保软件质量的关键环节&#xff0c;但传统的手动测试方法存…

阿里巴巴中国站关键字搜索API返回值全攻略:精准定位所需商品

当使用阿里巴巴中国站的关键字搜索API时&#xff0c;理解其返回值的结构和内容对于精准定位所需商品至关重要。以下是一份全面的攻略&#xff0c;帮助你更好地利用这个API&#xff1a; 在商品列表中&#xff0c;每个商品对象都包含丰富的信息&#xff0c;以帮助你精准定位所需商…

shell常用文件处理命令

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

PDF文档如何签名?用Adobe信任的文档签名证书

为PDF文档电子签名的方式有多种多样&#xff0c;但并非所有方案都是可靠的。我们在市面看到的电子图章、电子印章等仅在文档中置入印章图片的方式&#xff0c;并不具有任何法律上的有效性&#xff0c;它只是显示印章的图形效果&#xff0c;随时可以被篡改、伪造。PDF文档如何签…

煤矿设备故障ar远程诊断系统缩短时间

深圳华锐视点&#xff0c;一家专注于AR增强现实技术服务的创新型企业&#xff0c;致力于为电商、金融、快消、文创等众多行业赋予AR超能力。我们坚信&#xff0c;AR技术不仅是现实的延伸&#xff0c;更是未来生活的引领者。 在现实与虚拟交织的AR世界中&#xff0c;我们全面开启…

安泰ATA-309C:功率放大器的分类及区别是什么

功率放大器是一种电子器件&#xff0c;用于将低功率信号放大到更高功率&#xff0c;以驱动负载或增强信号强度。功率放大器根据其工作原理、电路拓扑和应用领域的不同&#xff0c;可以分为多种类型。下面将介绍几种常见的功率放大器分类及其区别。 A类功率放大器&#xff1a;A类…

实战Java虚拟机-基础篇

一、基础篇-Java内存区域 1.运行时数据区 运行时数据区-总览 Java虚拟机在运行Java程序过程中管理的内存区域&#xff0c;称之为运行时数据区。 《Java虚拟机规范》中规定了每一部分的作用。 1.程序计数器 程序计数器&#xff08;Program Counter Register&#xff09;也叫…

鸿蒙——即将是国内全部物联网的搭载系统

国内物联网时代 中国国内物联网时代是指在中国国内&#xff0c;物联网&#xff08;Internet of Things&#xff0c;简称IoT&#xff09;技术得到广泛应用和发展的时代。在这个时代&#xff0c;各种设备和物品都可以通过互联网进行连接和交互&#xff0c;实现信息的采集、传输和…

教程分享:如何为跨境电商、外贸、国际展会制作二维码?

不论是做跨境电商、在全球做产品推广&#xff0c;还是国外的餐厅运营、参加国际展会&#xff0c;或者是做创意户外广告、制作个性化的个人名片、有趣的产品包装……只要是在国外使用二维码&#xff0c;你都可以在QR Tiger去制作您需要的二维码&#xff01; 一、认识QR Tiger 二…

读源码系列文章--开源项目openjob之alarm告警模块

一、背景 告警模块&#xff0c;作为大多数应用都存在的一个基础功能&#xff0c;今天我们就以开源项目openjob 为例&#xff0c;分析其设计及实现。 首先&#xff0c;我们梳理一下需求&#xff1a; 支持多种告警方式&#xff0c;包括钉钉、飞书、微信和webhook。方便业务模块…

C++实现二叉搜索树(模型)

目录 1.二叉搜索树的概念 2.二叉搜索树的实现 2.1总体代码预览 2.2各个函数实现原理 链表结构体 二叉搜索树的成员变量 二叉搜索树的插入 二叉搜索树的查找 二叉搜索树的遍历 二叉搜索树的删除 1.二叉搜索树的概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#…

CSS中文本样式(详解网页文本样式)

目录 一、Text介绍 1.概念 2.特点 3.用法 4.应用 二、Text语法 1.文本格式 2.文本颜色 3.文本的对齐方式 4.文本修饰 5.文本转换 6.文本缩进 7.color&#xff1a;设置文本颜色。 8.font-family&#xff1a;设置字体系列。 9.font-size&#xff1a;设置字体大小。…

做好源代码防泄密的10条准则

#深度好文计划# 近年来&#xff0c;电脑以及互联网应用在中国的普及和发展&#xff0c;已经深入到社会每个角落&#xff0c; 政府&#xff0c;经济&#xff0c;军事&#xff0c;社会&#xff0c;文化和人们生活等各方面都越来越依赖于电脑和网络。企业需要花费大量的时间精力去…

PC小程序解密及反编译

一、小程序包解密 小程序原始加密包位置C:\Users\administrator\Documents\WeChat Files\Applet\wx234324324324 二、wxappUnpacker反编译 npm install./bingo D:\temp\小程序包解密\wxpack\wx234324324324.wxapkg 三、查看反编译后的文件

Fluence Developer Rewards 国内 每个账号收2000元

# 国内有金主支持 每个账号收2000元 Fluence Developer Rewards account_line 白名单见附件 # 感兴趣的请留言 或加微信 Fluence Developer Rewards This repo allows one to generate a proof signature for Fluence dev reward claiming. 感兴趣 Caution Beware of s…

MapReduce的Shuffle过程

Shuffle是指从 Map 产生输出开始,包括系统执行排序以及传送Map输出到Reduce作为输入的过程. Shuffle 阶段可以分为 Map 端的 Shuffle 阶段和 Reduce 端的 Shuffle 阶段. Shuffle 阶段的工作过程,如图所示: Map 端的 Shuffle 阶段 1&#xff09;每个输入分片会让一个 Map 任务…