Java中mongodb指定DB通过aggregate聚合查询操作示例

news2025/1/12 4:01:28

目录

前言:

应用场景:

命令描述:​

 代码示例:

聚会查询:

数量查询: 


前言:

        大家都知道,mongodb是一个非关系型数据库,也就是说,mongodb数据库中的每张表是独立存在的,表与表之间没有任何依赖关系。当我们数据量非常大时,都通过筛选条件去筛选不尽人意;所以,我们设计的时候,就直接通过DB进行区分,如:聊天记录,通过roomId建DB等。在mongodb中,除了各种CRUD语句之外,还给我们提供了聚合的功能,这篇文章主要来跟大家聊聊mongodb的aggregate的操作。

应用场景:

        最近因开发直播项目,用MongoDB存储用户聊天数据,后期数据量会非常大。处理好数据结构,每天处理上亿的数据没问题,小编以前就用Mongodb存储路由器访问记录数据,每天过亿。

MongoDB 是一种文档型数据库,里面分为数据库(DBs)和集合(Collections),分别相当于SQL的数据库和数据表。数据因为本次业务原因,做的都是查询操作,没有增删改等操作。

命令描述:

管道的概念:
管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数。
MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。
表达式:处理输入文档并输出。表达式是无状态的,只能用于计算当前聚合管道的文档,不能处理其它的文档。
这里我们介绍一下聚合框架中常用的几个操作:
  ● $project:(select)修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
  ● $match:(where)用于过滤数据,只输出符合条件的文档。 $match使用MongoDB的标准查询操作。
  ● $group:(group by)将集合中的文档分组,可用于统计结果。
  ● $match:(having)。
  ● $sum:(sum)可用于统计结果。
  ● $sum $sortByCount:(count)可用于统计数。
  ● $lookup:(join)建立连接。
  ● $limit:(limit)用来限制MongoDB聚合管道返回的文档数。
  ● $skip:(偏移量)在聚合管道中跳过指定数量的文档,并返回余下的文档。
  ● $unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
  ● $sort:(order by, 1升序,-1降序)将输入文档排序后输出。
  ● $geoNear:输出接近某一地理位置的有序文档。

 代码示例:

需要注意的是,MongoDB有一个管道的概念,相当于一层一层的过滤,顺序不能乱,否则会报错(A pipeline stage specification object must contain exactly obe field)。这其实和我们在用sql语句查询时候是一样的,都是select.....where....group by....order by....limit...顺序不能乱是一样的。

聚会查询:

// match(相当于 WHERE 或者 HAVING )
BasicDBObject query= new BasicDBObject();
BasicDBObject[] array = { new BasicDBObject("time", new BasicDBObject("$gte", "2018-09-12")),new BasicDBObject("time", new BasicDBObject("$lte","2018-12-25"))};
query.append("$and", array);
BasicDBObject match = new BasicDBObject("$match", query); 
 
// group(相当于 GROUP BY)
BasicDBObject group = new BasicDBObject("$group", new BasicDBObject("_id", "$subject")
            .append("count", new BasicDBObject("$sum", 1)));
 
// sort(排序)
BasicDBObject sort = new BasicDBObject("$sort", new BasicDBObject("count", -1));//1:正序,-1倒序
 
// skip(跳过前面多少条数据,分页时使用)
//limt(只要前多少条数据,分页时使用)
BasicDBObject limit = new BasicDBObject("$limit", pageSize);
BasicDBObject skip = new BasicDBObject("$skip", (pageNo - 1) * pageSize);
 
// queryList集合里的**顺序不能乱**,否则会报错。 
List<DBObject> queryList = new ArrayList<>();
queryList .add(match);
queryList .add(group);
queryList .add(sort);
queryList .add(skip);
queryList .add(limit);

// 变量dbName,动态指向DB
AggregateIterable<Document> iterable = mongoClient.mongoClient.getDatabase(dbName).getCollection(gatherName).aggregate(queryList );
 

    上面的代码就是进行聚合后的操作,查询出的集合里有(_id,count)两个字段,_id对应的值就是subject,count对应的值是总数,这样我们就可以查出结果了,并且进行了分页操作,只需要传入相应pageNo和pageSize就可以了。

数量查询: 

由于我们设计的时候,是通过房间为维度roomID作为DB(变量DBName),查询数量可以通过以下方式:

// 获取聊天总数
Long count = mongoTemplate.getCollection(DBName).countDocuments();

如果本篇文章对你有帮助的话,很高兴能够帮助上你。

当然,如果你觉得文章有什么让你觉得不合理、或者有更简单的实现方法又或者有理解不来的地方,希望你在看到之后能够在评论里指出来,我会在看到之后尽快的回复你。

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

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

相关文章

node-express学习总结

项目搭建 1. 使用express提供的框架构建&#xff08;不需要&#xff09; 2. 从零开始&#xff08;推荐&#xff09;安装 初始化项目 npm init -y安装express npm install express1.express的基本使用 创建js文件 const express require(express) // 1&#xff0c;创建服…

SSL/TLS类安全漏洞及SLB安全漏洞问题

SSL/TLS类安全漏洞及SLB安全漏洞问题1 : 问题背景1.1、SSL/TLS类漏洞-Sweet32 攻击1.2、SSL/TLS类漏洞-弱密码套件2 : 解决思路2.1、学习SSL/TLS是什么2.2、安装检测工具2.3、升级OpenSSL2.4、调整加密算法3 : 总结3.1、比较环境的不同3.2、解决该问题3.3、相关资源1 : 问题背景…

创建进程与进程地址空间

目录 创建进程 进程地址空间 为什么要用虚拟地址呢&#xff1f; 什么是进程地址空间&#xff1f; 为什么要写时拷贝呢&#xff1f; 创建进程 前面提到使用fork可以创建子进程&#xff0c;现在介绍fork创建子进程的细节。 fork创建子进程的时候&#xff0c;子进程的内核数…

如何给公司内网搭建一个专用的DNS服务器?

如何给公司内网搭建一个专用的DNS服务器&#xff1f; 引言 平时做域名解析&#xff0c;一般直接修改的/etc/hosts文件。对于服务器数量小的情况完全可以&#xff0c;但是如果服务器数量较多&#xff0c;每个都修改比较麻烦。 DNS是作为域名解析。在实际的生产过程中&#xff…

基于ASP.NET C#的服装商城管理系统

摘 要 本毕业设计的内容是设计并且实现一个基于net语言的服装商城管理系统。它是在Windows下&#xff0c;以SQL Server为数据库开发平台&#xff0c;服装商城管理系统的功能已基本实现&#xff0c;主要包括用户、服装信息、通知公告、留言板、订单信息等。 论文主要从系统的分…

飞腾FT-2000/4处理器+复旦微FPGA+国产操作系统解决方案(2)

XM-1104飞腾核心处理主板 ▶体积小、功耗低、高性能。 ▶功能接口多样化&#xff0c;采用高密度连接器&#xff0c;抗震效果好。 ▶成本低&#xff0c;扩展性强&#xff0c;根据用户的需求定制各种底板。 ▶产品灵活&#xff0c;便于维护&#xff0c;生命周期长。 指标 参数 …

SuperMap GIS地质体数据处理QA

作者:hyy 一、地质体数据简介 什么是三维地质建模&#xff1f;百度上给出的解析是&#xff1a;将地质、测井、地球物理资料和各种解释结果或者概念模型综合在一起生成的三维定量随机模型。 已建成的地质模型可以为我们提供很多信息。首先是地质的三维可视化。通过三维可视化&…

量子计算机:一场改变世界的开发竞赛

这样的设备可能会帮助解决气候变化和粮食短缺问题&#xff0c;也可能破坏互联网。在这场竞赛中&#xff0c;美国和中国谁会先到达目标&#xff1f; 神秘的机器 在加利福尼亚州圣巴巴拉的郊区&#xff0c;在果园和大海之间&#xff0c;坐落着一个不起眼的仓库&#xff0c;它的窗…

【区块链 | EVM】深入理解学习EVM - 深入Solidity数据存储位置

目录 目录 简介 EVM是一个工业工厂 为什么要在 Solidity 中理解 Evm 数据位置&#xff1f; 数据位置 → 概述 存储 内存 Calldata 堆栈&#xff08;Stack&#xff09; 代码 数据位置 - 规则 变量的默认位置 参考类型 在函数参数上的规则 在函数体内的规则 内存…

使用 QuTrunk+Amazon ParallelCluster3 进行并行计算

1.丘秉宜&#xff1b;2.邵伟&#xff1b;3.黄文&#xff1b;4.郭梦杰&#xff1b;5.刘利&#xff1b;6.刘波 1.亚马逊云科技 Hero&#xff1b;2.启科开发者生态负责人&#xff1b;3.启科 DEVOPS 工程师&#xff1b;4.启科量子资深研发工程师&#xff1b;5和&#xff1b;6.C高级…

Linux运维之knockd部署

如果你有一台公众可访问的服务器&#xff0c;黑客可以轻松扫描其IP地址&#xff0c;查找服务器上的开放端口(尤其是用于SSH的端口22)。将服务器隐藏起来、不让黑客看见的一种方法是使用knockd。knockd是一种端口试探服务器工具。它侦听以太网或其他可用接口上的所有流量&#x…

以代码绘制圣诞,过快乐圣诞节!

2022年圣诞节 12月25日 星期日 圣诞节的由来 基督教纪念耶稣诞生的重要节日。亦称耶稣圣诞节、主降生节&#xff0c;天主教亦称耶稣圣诞瞻礼。耶稣诞生的日期&#xff0c;《圣经》并无记载。公元336年罗马教会开始在12月25日过此节。12月25日原是罗马帝国规定的太阳神诞辰。有人…

百度百科怎么创建的?百度百科创建技巧分享

百度百科的创建并没有那么简单&#xff0c;虽然百度百科人人都可以编辑&#xff0c;我们在网上一搜就会出来很多相关的百科创建步骤&#xff0c;但是当你真的按照这些步骤去做的时候&#xff0c;就会出现很多问题&#xff0c;导致根本通不过。 百度百科怎么创建的&#xff1f;实…

ArcGIS基础实验操作100例--实验2平移矢量要素

实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 基础编辑篇--实验2 平移矢量要素 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff08;1&#xff09;加载【Move】工具 &#xff08;2&#xff09;平移矢量要素 一、…

rocketmq搭建启动集成springboot落地并监控

目录 一、rocketmq服务器搭建启动&#xff1a; 二、springboot 集成rocketmq落地&#xff1a; 三、可视化页面集成&#xff1a; rocketmq是最近很流行的消息中间件&#xff0c;有很多的优点&#xff0c;比如多个topic也不会引起性能问题&#xff1b;今天我们开始搭建启动集成…

这5个素材库,新手也能让你做出精美的 PPT。

高质量免费PPT模板&#xff0c;各种PPT素材都有&#xff0c;文案模板直接套用&#xff0c;还有教程学习&#xff0c;对新手特别友好。1、菜鸟图库 https://www.sucai999.com/pptx.html?vNTYwNDUx网站有各种主题的PPT模板&#xff0c;工作总结、教育课件、述职汇报、节日庆典、…

美颜sdk中的人脸美型实现流程详解

在之前的文章中&#xff0c;小编讲了许多美颜sdk的功能实现流程&#xff0c;有一些是热门功能&#xff0c;例如美白、磨皮等&#xff0c;但是有一个功能小编遗漏没有讲到&#xff0c;虽然不常提起&#xff0c;但是它的热度并不低&#xff0c;这个功能就是——“人脸美型”。本篇…

一文解析Linux中断子系统softirq和tasklet

说明&#xff1a; Kernel版本&#xff1a;4.14ARM64处理器&#xff0c;Contex-A53&#xff0c;双核使用工具&#xff1a;Source Insight 3.5&#xff0c; Visio 1. 概述 中断子系统中有一个重要的设计机制&#xff0c;那就是Top-half和Bottom-half&#xff0c;将紧急的工作放…

电子招标采购系统—企业战略布局下的采购寻源

​ 智慧寻源 多策略、多场景寻源&#xff0c;多种看板让寻源过程全程可监控&#xff0c;根据不同采购场景&#xff0c;采取不同寻源策略&#xff0c; 实现采购寻源线上化管控&#xff1b;同时支持公域和私域寻源。 询价比价 全程线上询比价&#xff0c;信息公开透明&#xff0c…

嵌入式Linux内核开发必须了解的三十道题

Linux的同步机制从2.0到2.6以来不断发展完善。从最初的原子操作&#xff0c;到后来的信号量&#xff0c;从大内核锁到今天的自旋锁。这些同步机制的发展伴随Linux从单处理器到对称多处理器的过渡。 伴随着从非抢占内核到抢占内核的过度。Linux的锁机制越来越有效&#xff0c;也…