Loading [MathJax]/jax/output/CommonHTML/jax.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Mongo 实践之分组去重 aggregate group

Mongo 实践之分组去重 aggregate group

作者头像
用户4945346
发布于 2024-04-30 11:43:39
发布于 2024-04-30 11:43:39
46001
代码可运行
举报
文章被收录于专栏:pythonista的日常pythonista的日常
运行总次数:1
代码可运行
现在工作中的数据库存储都由 MySQL 切换到了MongoDB ,我计划写一个合集来记录用到的一些 Mongo 语句,有些是Mongo sql 语法,有些是 pymongo 的写法。

前段时间是需要查询一张表并对里面的数据去重。collection 表名叫 datatagging,它主要包含 3 个字段 "_id"、"unique_path"、"modified" ,我希望对 unique_path 这个字段去重,并根据 modified 这个日期字段保留最新的一条,返回的结果里必须包含 id。

实现的思路和希望的诉求是一样的,对 unique_path 进行分组,并且按照modified 倒序排列取每组第一条记录,然后把分组结果再输出

Mongo sql 是这样写的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from pymongo import MongoClient

# 连接到 MongoDB
client = MongoClient('mongodb://localhost:27017/')
db = client.your_database_name  # 更改为你的数据库名称
collection = db.datatagging

# 构建聚合管道
pipeline = [
    {
        "$sort": {"unique_path": 1, "modified": -1}  # 按照 unique_path 升序,modified 降序排序
    },
    {
        "$group": {
            "_id": "$unique_path",
            "latestModified": {"$first": "$modified"},  # 获取每个 unique_path 分组中 modified 最新的值
            "document": {"$first": "$$ROOT"}  # 获取整个文档对象
        }
    },
    {
        "$replaceRoot": {"newRoot": "$document"}  # 将保存的整个文档对象作为输出文档
    },
    {
        "$sort": {"modified": -1}  # 按照 modified 字段倒序排列
    }
]

# 执行聚合查询
result = list(collection.aggregate(pipeline))

# 输出结果
ids = []
for doc in result:
    print(doc["_id"])

aggregate 接收一个数组参数,里面包含多个对象,可以把这些对象看作一个管道,从第一个对象串行执行到最后一个对象。group 阶段的 _id 字段指定了用于分组的键,因为对 unique_path 分组,所以我 _id 设置了unique_path

通过上面查询出来的结果得到了去重后的文档ids,后面再对整张表查询将不在 ids 中的记录删除掉

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
delete_result = collection.delete_many({"_id": {"$nin": ids}})

# 输出删除的记录数
print("Deleted", delete_result.deleted_count, "documents.")

可以通过 delete_result.deleted_count 获取删除的条数

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-04-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 pythonista的日常 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
ActiveMQ介绍
1、ActiveMQ服务器工作模型       通过ActiveMQ消息服务交换消息。消息生产者将消息发送至消息服务,消息消费者则从消息服务接收这些消息。这些消息传送操作是使用一组实现 ActiveMQ应用编程接口 (API) 的对象来执行的。       ActiveMQ客户端使用 ConnectionFactory 对象创建一个连接,向消息服务发送消息以及从消息服务接收消息均是通过此连接来进行。Connection 是客户端与消息服务的活动连接。创建连接时,将分配通信资源以及验证客户端。这是一个相当重要
小帅丶
2018/02/08
1.2K0
ActiveMQ详解(2)——JMS基本概念
ActiveMQ详解(2)——JMS基本概念 一. JMS简介 JMS:Java Message Service,Java消息服务,是JavaEE的技术之一。JMS中定义了Java语言访问消息中间件的接口,但是并没有提供具体的实现。实现了JMS接口的消息中间件成为JMS Provider,ActiveMQ就是其中典型的、优秀的实现者。由于ActiveMQ的操作中涉及到了众多JMS相关的概念,因此本节对JMS基本概念进行详细介绍。 二. JMS基本概念 JMS Provider:实现了JMS规范和接口的消息中
张申傲
2020/09/03
5170
JMS中间件ActiveMQ详解
Java Message Service(JMS)是SUN提出的旨在统一各种MOM(Message-Oriented Middleware )系统接口的规范,它包含点对点(Point to Point,PTP)和发布/订阅(Publish/Subscribe,pub/sub)两种消息模型,提供可靠消息传输、事务和消息过滤等机制。
烂猪皮
2018/08/03
1.7K0
JMS中间件ActiveMQ详解
消息中间之ActiveMQ
JMS(JAVA Message Service,java消息服务)是java的消息服务,JMS的客户端之间可以通过JMS服务进行异步的消息传输。JMS(JAVA Message Service,java消息服务)API是一个消息服务的标准或者说是规范,允许应用程序组件基于JavaEE平台创建、发送、接收和读取消息。它使分布式通信耦合度更低,消息服务更加可靠以及异步性。
HUC思梦
2020/09/03
2.2K0
消息中间之ActiveMQ
ActiveMQ详细入门教程系列(一)
两个系统或两个客户端之间进行消息传送,利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信。
全栈程序员站长
2021/04/07
1.2K0
消息队列——ActiveMQ使用及原理浅析
什么是消息中间件?随着业务的急速增长以及分布式架构的逐渐兴起,首先要考虑的就是如何高效的在各节点之间传递消息,其次要考虑的是流量洪峰时如何削减系统的压力以及跨平台消息的传输等问题,消息中间件就可以帮我们解决以上问题。而消息队列产品众多,我们该如何选择呢?本系列文章主要针对目前使用最多的ActiveMQ、Kafka、RabbitMQ进行讲解说明。
夜勿语
2020/09/07
4.9K0
ActiveMQ的安装与使用。
4、ActiveMQ的安装。官方网址:http://activemq.apache.org/
别先生
2019/09/29
1.9K0
ActiveMQ的安装与使用。
深入了解ActiveMQ!
某一天,系统B的负责人告诉系统A的负责人,现在系统B的SystemBNeed2do(String userId)这个接口不再使用了,让系统A别去调它了。 于是,系统A的负责人说"好的,那我就不调用你了。",于是就把调用系统B接口的代码给删掉了。代码变成这样了:
JAVA日知录
2020/09/08
1.2K0
深入了解ActiveMQ!
ActiveMQ入门系列三:发布/订阅模式
在上一篇《ActiveMQ入门系列二:入门代码实例(点对点模式)》中提到了ActiveMQ中的两种模式:点对点模式(PTP)和发布/订阅模式(Pub & Sub),详细介绍了点对点模式并用代码实例进行说明,今天就介绍下发布/订阅模式。
全栈程序员站长
2022/07/18
6720
ActiveMQ入门系列三:发布/订阅模式
flea-msg使用之JMS初识
Java 消息服务【Java Message Service】,又简称 JMS,它是 Java 平台上有关面向消息中间件(MOM)的技术规范。
huazie
2024/06/12
2930
flea-msg使用之JMS初识
ActiveMQ从入门到精通(一)JMSActiveMQ QuickStartWrite Code 4 ActiveMQ在说说Session关于消息的priority/ttl/deliveryMode
这是关于消息中间件ActiveMQ的一个系列专题文章,将涵盖JMS、ActiveMQ的初步入门及API详细使用、两种经典的消息模式(PTP and Pub/Sub)、与Spring整合、ActiveMQ集群、监控与配置优化等。话不多说,我们来一起瞧一瞧!
用户2890438
2018/08/21
8810
ActiveMQ从入门到精通(一)JMSActiveMQ QuickStartWrite Code 4 ActiveMQ在说说Session关于消息的priority/ttl/deliveryMode
ActiveMQ入门系列二:入门代码实例(点对点模式)[通俗易懂]
在上一篇《ActiveMQ入门系列一:认识并安装ActiveMQ(Windows下)》中,大致介绍了ActiveMQ和一些概念,并下载、安装、启动他,还访问了他的控制台页面。
全栈程序员站长
2022/07/18
5770
ActiveMQ入门系列二:入门代码实例(点对点模式)[通俗易懂]
深入浅出JMS(一)——JMS简单介绍
假设手机仅仅能进行实时通话,没有留言和短信功能会怎么样?一个电话打过来,正好没有来得及接上,那么这个电话要传递的信息肯定就收不到了。为什么不能先将信息存下来,当用户须要查看信息的时候再去获得信息呢?伴随着这个疑惑,短息和留言应运而生,不管手机是否开机、是否未及时接到,我们都能得到当中的信息。JMS提供了相似这种功能,本章我们将系统的学习JMS中的相关重要内容。
全栈程序员站长
2022/07/11
8560
深入浅出JMS(一)——JMS简单介绍
ActiveMQ基础学习简单记录
JMS即Java Message Service,是JavaEE的消息服务接口。JMS主要有两个版本:1.1和2.0。2.0和1.1相比,主要是简化了收发消息的代码。
大忽悠爱学习
2023/05/23
1.8K0
ActiveMQ基础学习简单记录
Apache RocketMQ之JMS基本概念及使用
Apache RocketMQ之JMS基本概念及使用:https://www.jianshu.com/p/d2e3fd77c4f4 Apache RocketMQ 基础概念及架构解析:https://www.jianshu.com/p/95ab928960b3 Apache RocketMQ 的基础特性介绍:https://www.jianshu.com/p/570680b32590 Apache RocketMQ 集群搭建(两主两从):https://www.jianshu.com/p/b090138cf52c Apache RocketMQ 刷盘策略与复制策略: https://www.jianshu.com/p/d66b381428bb
zoro
2019/04/11
2.7K0
Apache RocketMQ之JMS基本概念及使用
JMS--ActiveMQ的简单使用
消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信。对于消息中间件,常见的角色大致也就有 Producer(生产者)、Consumer(消费者)。消息队列中间件是分布式系统中重要的组件,主要解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构。
宋先生
2019/07/18
1.2K0
ActiveMQ
场景说明:用户注册,需要执行三个业务逻辑,分别为写入用户表,发注册邮件以及注册短信。
JokerDJ
2023/11/27
5950
ActiveMQ
ActiveMQ入门系列一:认识并安装ActiveMQ(Windows下)
大意是:兼容性好并且功能强大的开源多协议消息中间件,那具体是怎么体现的呢? 1.兼容性好: ActiveMQ可以很容易内嵌到使用Spring的系统里面去, 通过了常见J2EE服务器(如 Geronimo,JBoss 4,GlassFish,WebLogic)的测试,其中通过JCA 1.5 resource adaptors的配置,可以让ActiveMQ可以自动的部署到任何兼容J2EE 1.4 商业服务器上 2.功能强大: 支持通过JDBC和journal提供高速的消息持久化, 支持客户端-服务器,点对点 支持Ajax 支持与Axis的整合, WebServices 可以很容易的调用内嵌JMS provider进行测试 从设计上保证了高性能的集群
全栈程序员站长
2022/07/18
1.3K0
ActiveMQ入门系列一:认识并安装ActiveMQ(Windows下)
MQ 系列之 ActiveMQ 基本使用
  activemq-client 通过创建 ConnectionFactory 建立到 ActveMQ 的连接,连接工厂封装了一组连接配置参数,这组参数在配置 ActiveMQ 时已经定义,例如 brokerURL 参数,此参数传入的是 ActiveMQ 服务地址和端口,支持 openwire 协议的默认连接为 tcp://localhost:61616,支持 stomp 协议的默认连接为 tcp://localhost:61613。ActiveMQConnectionFactory 构造方法:   ♞ ActiveMQConnectionFactory();   ♞ ActiveMQConnectionFactory(String brokerURL);   ♞ ActiveMQConnectionFactory(String userName, String password, String brokerURL);   ♞ ActiveMQConnectionFactory(String userName, String password, URI brokerURL);   ♞ ActiveMQConnectionFactory(URI brokerURL);
Demo_Null
2020/09/28
1.5K0
MQ 系列之 ActiveMQ 基本使用
Message Queue消息队列基本原理
如果需要和新的系统建立通信或删除已建立的通信,都需要修改代码,这种方案显然耦合度很高。
Java宝典
2021/01/14
3.4K0
Message Queue消息队列基本原理
相关推荐
ActiveMQ介绍
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验