python使用mongo操作

news2024/10/5 7:57:36

目前有个需求,就是把所有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

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

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

相关文章

Amazon Bedrock的进化:更多选择与新特性,助力生成式AI应用更快落地

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

YoloV9改进策略:Block改进|改进HCF-Net的PPA模块|附结构图|(独家改进,全网首发)

摘要 HCF-Net是一种用于红外小物体检测的深度学习网络。它主要包括三个模块:并行化斑块感知注意力(PPA)模块、维度感知选择性整合(DASI)模块和多稀释通道细化器(MDCR)模块。 PPA模块采用多分支特征提取策略,用于捕捉不同尺度和层次的特征信息。DASI模块可实现自适应信…

安卓使用Fiddler抓包 2024

简介 最近试了一下安卓使用fiddler 抓包&#xff0c;发现https包基本都会丢失。原因是Anandroid 7版本针对ssl安全性做了加强&#xff0c;不认可用户的证书。我们要做的就是把fiddler导出的证书进过处理后放置到系统证书目录下面&#xff0c;这样才能抓包https请求。 这里使用…

323_C++_QT_QProcess执行cmd解压、压缩、删除tar.gz等等其他压缩包文件到指定目录,不需要外部库,QT自带API的就行

// decompressPath : 解压到此目录 // fileName : 解压的tar.gz文件名executeCommand(decompressPath , QString::fromStdString(fileName));// 开始解压 void executeCommand

k8s ReplicaSet

ReplicaSet 是替代 ReplicationController 的&#xff0c;ReplicaSet 的行为与 ReplicationController 完全相同&#xff0c; 但pod 选择器的表达能力更强。 ReplicaSet 和 ReplicationController 的区别&#xff1a; ReplicationController 的标签选择器只允许包含某个标签的…

【Leetcode 42】 接雨水-单调栈解法

基础思路&#xff1a; 维持栈单调递减&#xff0c;一旦出现元素大于栈顶元素&#xff0c;就可以计算雨水量&#xff0c;同时填坑&#xff08;弹出栈顶元素&#xff09; 需要注意&#xff1a; 单调栈通常保存的是下标&#xff0c;用于计算距离 public static int trap2(int[…

YOLO系列笔记(十二)——csv文件转成text文件

csv文件转成text文件 前言方法概述实现代码说明结果 结论 前言 在上一篇文章中&#xff0c;我们探讨了如何将CSV格式的数据集转换为XML格式。然而&#xff0c;某些神经网络进行数据处理时&#xff0c;可能需要将数据直接以纯文本格式&#xff08;TXT&#xff09;提供。这种需求…

流畅的python-学习笔记_设计模式+装饰器+闭包

策略模式 类继承abc.ABC即实现抽象类&#xff0c;方法可用abc.abstractmethod装饰&#xff0c;表明为抽象方法 装饰器基础 装饰器实际是语法糖&#xff0c;被装饰的函数实际是装饰器内部返回函数的引用 缺点&#xff1a;装饰器函数覆盖了被装饰函数的__name__和__doc__属性…

Chatbot 在教育中的应用

Chatbot 在教育中的应用 基本信息 ​ 这篇博客主要介绍几篇Chatbot在教育领域中应用的文章&#xff0c;根据文章的侧重点不同&#xff0c;分为介绍教育理论&#xff0c;与介绍系统设计两类。从问题定义、技术方法、教育学理论、实验设计、结论证据几个方面概括各篇文章。 博…

html实现网页插入音频

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文主要介绍html中 如何插入音乐和视频 视频插入 标签:<video></video> 兼容格式:mp4,因为别的浏览器都有不兼容的格式&#xff0c;唯一对mp4全都兼容。所以尽量使用mp4格式。 属性: 属性属性值…

基于PSO优化的PV光伏发电系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于PSO优化的PV光伏发电系统simulink建模与仿真。其中PSO采用matlab编程实现&#xff0c;通过simulink的函数嵌入模块&#xff0c;将matlab调用进simulink中。 2.系统仿真结…

【统计推断】-01 抽样原理之(六):三个示例

目录 一、说明二、处理有限的、大尺度的母体抽样三、非参数的估计四、连续母体抽样技巧--分箱 一、说明 对于抽样问题&#xff0c;前几期文章都是理论探讨。本篇给出若干示例&#xff0c;展现具体的情况下&#xff0c;面对数据&#xff0c;如何给出处理策略。 二、处理有限的…

4步快速配置Java和MySQL环境

每次入职一家新公司或者用一台其他的临时电脑或者新电脑时都要重新配置Java开发环境&#xff0c;很麻烦&#xff0c;因此我在这里记录一下快速配置环境的方式&#xff0c;四步搞定&#xff01;此处以win为操作系统进行讲解。 第一步&#xff1a;下载链接 下载链接&#xff1a…

CMakeLists.txt语法规则:foreach循环的关键字

一. 简介 前一篇文章学习了 CMakeLists.txt语法中 foreach循环的基本用法。文章如下&#xff1a; CMakeLists.txt语法规则&#xff1a;foreach 循环基本用法-CSDN博客 本文继续 CMakeLists.txt语法中 foreach循环语句&#xff0c;主要学习 foreach循环中的关键字。 二. CM…

代码随想录打卡第14天第18天

二叉树 1 二叉树部分的一些新知 &#xff08;1&#xff09;二叉树的定义&#xff0c;C方法一定要知道&#xff0c;相对于链表而言&#xff0c;二叉树就是多了两个指针&#xff0c;即左右子节点 struct TreeNode {int val;TreeNode *left;TreeNode *right;TreeNode(int x) : …

C#上位机源程序 下位机单片机实现控制电机

基于C#的上位机编程程序&#xff0c;通过上位机控制下位机实现电脑操作控制步进电机的转动 程序 #include<reg52.h>#define uchar unsigned char#define uint unsigned int#include "2401.h"#include "delay.h"#include "ds18b20.h"sbit I…

LLM——用于微调预训练大型语言模型(LLM)的GPU内存优化与微调

前言 GPT-4、Bloom 和 LLaMA 等大型语言模型&#xff08;LLM&#xff09;通过扩展至数十亿参数&#xff0c;实现了卓越的性能。然而&#xff0c;这些模型因其庞大的内存需求&#xff0c;在部署进行推理或微调时面临挑战。这里将探讨关于内存的优化技术&#xff0c;旨在估计并优…

easy_ssti_ctfshow_2023愚人杯

https://ctf.show/challenges#easy_ssti-3969 2023愚人杯有提示app.zip&#xff0c;访问 https://1f660587-5340-4b20-b929-c4549d9a5d4b.challenge.ctf.show/app.zip得到压缩包&#xff0c;拿到一个py文件 可以看到参数名是name&#xff0c;对参数进行筛选&#xff0c;包含ge…

Hbase 常用shell操作

目录 1、创建表 1.1、启动HBase Shell 1.2、创建表 1.3、查看表 1.4、删除表 2、插入数据 2.1、put命令 3、查看数据 3.1、get命令 3.2、查询数据中文显示 4、更新数据 4.1、使用put来更新数据 5、删除数据 5.1、delete命令 5.2、删除指定列的数据 5.3、delete…

STM32——TIMER(定时器)篇

技术笔记&#xff01; 1. 定时器概述&#xff08;了解&#xff09; 1.1 软件定时器原理 使用纯软件&#xff08;CPU死等&#xff09;的方式实现定时&#xff08;延时&#xff09;功能 缺点&#xff1a;1. 延时不准确 2. CPU死等。 1.2 定时器定时原理 1.…