Mongodb——使用Mongodb对字段中字符串内容进行截取,并进行分组统计

2023-11-19

最近忙的厉害,除了发一发之前写的存货只能写一些简单的东西了。

这里就简单分享下最近遇见针对数据进行指标统计遇见的问题。

针对字段中某部分内容的指标统计

在使用mongodb进行指标统计的时候可能遇见下面的数据结构

/* 1 */
{
    "_id" : ObjectId("5edf4b5c64574814bc8ae4ae"),
    "address" : "河南,信阳",
    "state" : 0,
    "remark" : "发送成功",
    "createAt" : NumberLong(1591199999000)
}

/* 2 */
{
    "_id" : ObjectId("5edf4ca064574814bc8ae4d5"),
    "address" : "湖北,武汉",
    "state" : 0,
    "remark" : "发送成功",
    "createAt" : NumberLong(1591199999000)
}

/* 3 */
{
    "_id" : ObjectId("5edf4cac64574814bc8ae4d9"),
    "address" : "湖北,宜昌",
    "state" : 0,
    "remark" : "发送成功",
    "createAt" : NumberLong(1591199999000)
}

在某些时候我们可能需要根据地区信息来统计一些数据,但是数据并非是绝对干净的,可能只需要我们根据部分字段进行统计。

这个时候就需要使用$split或者使用$substr进行分组计算。

比如上面的数据中需要我们统计每个省下面业务数据内容。

使用split进行字符串截取

db.getCollection('AreaDemoLog').aggregate([
    {
        "$project": {
            // 首先使用$split对address字段进行切割,得到名称为regions的地区数组
            "regions": {
                "$split": ["$address",","]
            }
        }
    },
    {
        "$project": {
            "regions": 1,
            // 然后使用$arrayElemAt获得regions的地区数组中第一个元素,命名为 province 
            "province": {
                "$arrayElemAt": [ "$regions",0]
            }
        }
    },
    {
        "$group": {
            // 最后根据province字段分组求总
            "_id": "$province",
            "count": {
                "$sum": 1
            }
        }
    },
    {
        "$project": {
            "count": 1,
            "_id": 0,
            "province": "$_id"
        }
    }
])

使用substr进行字符串截取

db.getCollection('AreaDemoLog').aggregate([
    {
        "$project": {
            // 首先使用$substrCP对address字段进行截取,然后直接得到目标字段
            "province": {
                $substrCP:  [ '$address', 0, 2 ]
            }
        }
    },
    {
        "$group": {
            // 最后根据province字段分组求总
            "_id": "$province",
            "count": {
                "$sum": 1
            }
        }
    },
    {
        "$project": {
            "count": 1,
            "_id": 0,
            "province": "$_id"
        }
    }
])

关于字符串截取注意

对于截取纯英文和数字的字符串结构的时候可以使用$substr但是使用纯汉字的字段进行截取的时候,使用$substr根据设置的编码情况会出现下面异常:

$substrBytes:  Invalid range, ending index is in the middle of a UTF-8 character.

因为$substr仅适用于ASCII编码。所以这个时候需要使用mongodb 3.4中引入的$substrCP来进行字符串切割。

上面两个查询都可以得到正确结果

/* 1 */
{
    "count" : 16.0,
    "province" : "湖北"
}

/* 2 */
{
    "count" : 1.0,
    "province" : "河南"
}

将上面查询转换为JAVA代码

将上面查询语句放到JAVA代码中是下面的结构

使用split进行字符串截取

    public static String test() {
        List<AggregationOperation> lstOperations = new ArrayList<>(10);
        // 切分地区
        AggregationOperation splitAgg =
            Aggregation.project().andExpression("{ $split: {'$address', ','}}").as("regions");
        lstOperations.add(splitAgg);

        ProjectionOperation province =
            Aggregation.project("$regions").andExpression("{ $arrayElemAt: { '$regions', 0 }}").as("province");
        lstOperations.add(province);
        // 求总
        AggregationOperation groupAgg = Aggregation.group("$province").count().as("count");
        lstOperations.add(groupAgg);
        // 定义查询内容
        ProjectionOperation projectionOperation =
            Aggregation.project("count").andExclude("_id").and("$_id").as("province");
        lstOperations.add(projectionOperation);

        AggregationOptions aggregationOptions = AggregationOptions.builder().allowDiskUse(true).build();
        //开始查询
        Aggregation agg = Aggregation.newAggregation(lstOperations).withOptions(aggregationOptions);
        AggregationResults<Map> groupResult = this.mongoTemplate.aggregate(agg, "AreaDemoLog", Map.class);
        return "";
    }

使用substr进行字符串截取

    public static String test() {
        List<AggregationOperation> lstOperations = new ArrayList<>(10);
        // 切分地区
		ProjectionOperation province = 
			Aggregation.project().andExpression("{ $substrCP: { '$address', 0, 2 } }").as("province");
		lstOperations.add(province);
        // 求总
        AggregationOperation groupAgg = Aggregation.group("$province").count().as("count");
        lstOperations.add(groupAgg);
        // 定义查询内容
        ProjectionOperation projectionOperation =
            Aggregation.project("count").andExclude("_id").and("$_id").as("province");
        lstOperations.add(projectionOperation);

        AggregationOptions aggregationOptions = AggregationOptions.builder().allowDiskUse(true).build();
        //开始查询
        Aggregation agg = Aggregation.newAggregation(lstOperations).withOptions(aggregationOptions);
        AggregationResults<Map> groupResult = this.mongoTemplate.aggregate(agg, "AreaDemoLog", Map.class);
        return "";
    }

将上面查询转换为JAVA代码需要注意内容

在mongodb查询中我们使用了下面的语句

"$split": ["$address",","]

"$arrayElemAt": [ "$regions",0]

$substrCP:  [ '$address', 0, 2 ]

在使用MongodbTemplate进行查询的假如直接使用下面的拼写

andExpression("{ $split: [ '$address', ',' ] }")

andExpression("{ $arrayElemAt: [ '$regions', 0] }")

andExpression("{ $substrCP: [ '$address', 0, 2 ] }")

最终的查询会出现下面异常

{
    "code": 1,
    "msg": "Expression [{ $split: ['$address', ',']}] @23: EL1043E: Unexpected token. Expected 'rsquare(])' but was 'comma(,)'"
}

所以在将上面语句转到JAVA中的语句时候需要将"[...]"修改为"{...}"


个人水平有限,上面的内容可能存在没有描述清楚或者错误的地方,假如开发同学发现了,请及时告知,我会第一时间修改相关内容。假如我的这篇内容对你有任何帮助的话,麻烦给我点一个赞。你的点赞就是我前进的动力。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mongodb——使用Mongodb对字段中字符串内容进行截取,并进行分组统计 的相关文章

  • 自动记录数据录入时间不懂得VBA的朋友可以看看

    在日常工作中 经常会遇到需要实时记录数据录入的时间问题 有朋友会说了 用快捷键啊 按Ctrl 分号 可以返回当前的系统日期 按Ctrl Shift 分号 可以返回当前的系统时间 但是如果需要同时返回日期和时间又该怎么处理呢 对于懂得VBA的
  • 【financial markets】 2. EURIBOR

    1 EURIBOR EURIBOR 全称是 EURO Interbank offered rate 相当于 欧元的LIBOR 与EONIA一样 EURIBOR是无担保的银行间借贷利率 但是有两点很明显的不同 1 EURIBOR的也是取平均数
  • C# WPF在xaml中的数据绑定

    在WPF的绑定中个人分为两种 非集合数据绑定和集合数据绑定 非集合数据绑定 指的是包含数据为单个de控件的数据绑定 而不是有很多子项 例如Button TextBox TextBlock等等的绑定 集合数据绑定 指的是包含很多子项的控件的数
  • php+redis实现对200w用户的即时推送服务

    欢迎加入 新群号码 99640845 怎么实现对200w用户的即时推送 这个推送可以理解为调用第三方的接口 push sms之类的东西 当时先写了一个demo 直接读取DB然后单个推送 结果 可想而知 于是设计一套基于redis php多进
  • 用R建立岭回归和lasso回归

    1 分别使用岭回归和Lasso解决薛毅书第279页例6 10的回归问题 例6 10的问题如下 输入例题中的数据 生成数据集 并做简单线性回归 查看效果 cement lt data frame X1 c 7 1 11 11 7 11 3 1
  • Flatbuffers使用解析

    Flatbuffers使用解析 在今日头条偶然看到一个技术分享视频 标题很唬人 json之后下一代数据交换格式 大致是这样 不明觉厉 赶紧打开观看 原来Flatbuffers是Google为游戏或者其他对性能要求很高的应用开发的一种数据交换
  • Excel分割字符串

    在数据处理中我们经常会遇到分割字符的情况 比如读取csv文件 Excel提供了可视化的字符串分割方法 1 按分隔符 分割字符串 2 选择用 逗号 分割 3 结果如图
  • 你的数据隐私值多少钱?也许已有答案了

    全文共6032字 预计学习时长12分钟 图片来源 Timo Lenzen 对于一些大型科技公司来说 这一年侵犯用户隐私付出的代价变高了 未来还会更高吗 今年7月 脸书在受到有关泄露数亿用户数据隐私的指控后 同意缴纳50亿美元的罚金 同一周内
  • Elasticsearch的路由(Routing)特性

    Elasticsearch路由机制介绍 Elasticsearch的路由机制与其分片机制有着直接的关系 Elasticsearch的路由机制即是通过哈希算法 将具有相同哈希值的文档放置到同一个主分片中 这个和通过哈希算法来进行负载均衡几乎是
  • java中的基本数据类型和引用数据类型以及它们的存储方式堆内存和栈内存

    一直对java中的基本数据类型和引用数据类型之间的关系搞不太清楚 今天做leetcode的一道题目 总算弄清楚了关系 写下来和大家一起分享一下 一 基本数据类型 数据类型在计算机语言里面 是对内存位置的一个抽象表达方式 可以理解为针对内存的
  • 统计学习方法学习笔记(一)————统计学习方法概论

    1 统计学习 1 统计学习概念 统计学习 statistical learning 是关于计算机基于数据构建概率统计模型并运用模型对数据进行预测与分析的一门学科 统计学习也称为统计机器学习 statistical machine learn
  • 【elasticsearch】ES 单分片使用 From/Size 分页遇到重复数据

    1 概述 ES 单分片使用 From Size 分页遇到重复数据 常规情况下 ES 单分片使用 From Size 是不会遇到数据重复的 数据重复的可能原因有 没有添加排序 添加了按得分排序 但是查询语句全部为 filter 过滤条件 此时
  • MODIS数据的简介和下载(一)——MODIS数据简介

    借最近上课实习上机内容 来介绍MODIS数据相关方面内容 本部分主要包括了MODIS数据的简介和下载的问题 本篇是第一部分 MODIS的简介 主要分为三个部分 1 MODIS传感器简介及参数 2 MODIS产品及命名规则 3 MODIS的典
  • 数据链路层的有那三个基本问题?为什么都必须加以解决?

    数据链路层的有那三个基本问题 为什么都必须加以解决 数据链路层的三个基本问题 封装成帧 透明传输 差错检测 封装成帧就是在一段数据前后分别添加首部和尾部 接收端以便从收到的比特流中识别帧的开始与结束 帧定界是分组交换的必然要求 透明传输避免
  • 数据库中表数据备份

    目的 在所有的数据仓库类项目中几乎都会涉及到数据库中表数据备份的操作 主要是为了对一些结果数据进行备份 防止误操作 过程 一 背景 本次我们用的方法是通过在数据库中建立一个备份用户进行数据备份的操作 原因是现在的数据库一般是基于HDFS开发
  • 【房价网房价信息爬虫】整站40万条房价数据并行抓取,可更换抓取城市

    写在前面 学习数据采集 先转载下来 之后在学习 这次的爬虫是关于房价信息的抓取 目的在于练习10万以上的数据处理及整站式抓取 数据量的提升最直观的感觉便是对函数逻辑要求的提高 针对Python的特性 谨慎的选择数据结构 以往小数据量的抓取
  • hibernate注解自动生成数据表

    按习惯来说 一般系统开发都是从数据库开始设计的 但从面向对象开发的角度 系统的设计应该基于对象模型的设计之上 主要考虑对象的设计和逻辑 然后按照对象模型生成数据库结构 利用hibernate的SchemaExport对象可以方便的实现这一点
  • zigbee串口打印无法显示或乱码解决方法

    zigbee串口打印问题 在终端节点向协调器发数据时 在数据流中伴有该节点的网络地址 而有时通过PC端无法打印出来 1 可能是串口软件的问题 用过好几个串口软件 有时会出现停止 或乱码行为 在经过多次换用软件 发现 SecureCRT 这个
  • Docker 从入门到精通(二) 搭建本地仓库

    导读 docker 是Linux下面的容器技术 是目前最火的开源技术之一 上次我们了解了docker的基础知识 docker的容器 仓库 镜像等 接下来我们就一起来看下本地仓库的搭建吧 一 本地安装 yum install y python
  • C/C++编程题开头字符串、数据输入几种写法

    1 题设 在IT公司编程题中 多数会让你一并写上测试数据输入和结果输出的Demo 这也是程序员基本的功底 想一想如果连自己的测试数据都无法给入 后面的算法写的再好 也无法测试它的准确性和效果 下面分别从c c 以及字符串输入和数组输入 来谈

随机推荐

  • PHP base64转图片

    转图片 public function tupian base64 image content data image png base64 9j 4AAQSkZJRgABAQEASABIAAD 4QAiRXhpZgAATU0AKgAAAAg
  • [网络安全]sqli-labs Less-5 解题详析

    网络安全 Less 5 GET Double Injection Single quotes String 双注入GET单引号字符型注入 判断注入类型 判断注入点个数 查库名 爆破 left函数 抓包 查库名 双查询注入 原理 实例 查库名
  • Qt VS Tools插件没有Qt Option选项(VS 2022)

    Qt VS Tools插件没有Qt Option选项 VS 2022 在尝试用Vs2022搭建Qt开发环境时 跟着网上教程 发现自己安装完Qt Vs Tools后 没有Qt Option选项 如图 推测可能是版本太新的问题 于是点开Opti
  • SpringCloud-服务注册与发现

    服务注册与发现 前面我们没有服务注册中心 也可以服务间调用 为什么还要服务注册 当服务很多时 单靠代码手动管理是很麻烦的 需要一个公共组件 统一管理多服务 包括服务是否正常运行 等 Eureka用于 服务注册 目前官网已经停止更新 1 Eu
  • Vue项目中 vue-waterfall-easy 瀑布流框架使用

    1 Installation 安装 进入到项目当前文件夹 执行命令 npm install vue waterfall easy save 2 引入vue waterfall easy 2 1 main js中引入 import vueWa
  • MVC MVP MVVM

    参考MVC MVP MVVM的区别 前端面试标准答案 知乎 zhihu com 总结 MVC将应用抽象为数据层 Model 视图层 View 逻辑层 controller 降低了项目耦合 但MVC并未限制数据流 Model和View之间可以
  • Android 获取系统中软件的信息

    得到手机中所有的应用程序信息 return public List
  • 【100%通过率 】华为OD真题c++/python 【羊、狼、农夫过河】【 2022 Q4

    华为OD机试 题目列表 2023Q1 点这里 2023华为OD机试 刷题指南 点这里 题目描述 羊 狼 农夫都在岸边 农夫有一艘容量固定的船 要求求出不损失羊情况下将全部羊和狼运到对岸需要的次数 农夫在或农夫离开后羊的数量大于狼的数量时狼不
  • css3动画属性解析:【transition-过渡】

    一 css3动画之 transition 语法 简写方式 transition property duration timing function delay div transition all 1s ease in out 2s 上面这
  • PWM模块:边沿对齐PWM和中心对齐PWM

    PWM模块 边沿对齐PWM和中心对齐PWM 当PWM 时基工作在自由运行模式时 模块产生边沿对齐的PWM 信号 给定PWM 通道的输出1 边沿对齐模式 信号的周期由装入PTPER 的值指定 其占空比由相应的PDCx 寄存器指定 参见图15
  • ChatGPT热度“狂飙”,OceanBase也去找它唠了唠

    最近互联网的关键字 非 ChatGPT 莫属 就是这个小东西 集唠嗑 提问 答疑 科普 写作于一体 让我看看哪个孤独的打工人 还没和 ChatGPT 聊上一聊 有人说 ChatGPT 这么智能 或将取代人类的工作 OceanBase 的小编
  • c/c++资源汇总

    Visual C 视频技术方案宝典 pdf http www t00y com file 17628500 Windows 图形编程 pdf http www t00y com file 17628502 Windows程序设计 第2版 p
  • 100天精通Python(数据分析篇)——第52天:numpy模块完结篇

    文章目录 一 拷贝 1 赋值 2 视图 3 副本 4 注意点copy和view 二 numpy常用方法 1 小技巧 2 生成随机数 三 numpy中的nan和inf 一 拷贝 1 赋值 简单的赋值不会创建数组对象的副本 相反 它使用原始数组
  • Unity 使用Photon Server 联网开发(二)游戏同步+房间列表

    photon联机的配置 直接去官网下载Pun的资源包导入项目 设置PhotonServerSettings配置文件 配置appid 通讯协议 服务器地址 端口号 服务器地址可以配置成自己本地服务器 云服务器 直接使用photon服务器 也可
  • 吕聪贤SwiSHmax中文视频教程打包下载(连接已失效)

    教程介绍 SwiSHmax是Flash编辑工具 SwiSHzone家族的新成员 假如您想要不使用Flash来制作强大或令人惊叹的动画 SwiSHmax是您最佳的选择 SwiSHmax操作方便 您将可轻易的在短时间内制作出复杂的文本 图像 图
  • HashTable HashMap ConcurrentHashMap 的介绍以及区别

    目录 今日良言 投资自己才是最好的投资 一 HashMap 二 HashTable 三 ConcurrentHashMap 四 三者的区别 今日良言 投资自己才是最好的投资 这篇博客主要介绍的是 HashTable HashMap Conc
  • 计算机图形学 3D渲染 笔记(一)

    1 坐标系 大多数计算机屏幕采用的坐标系是以左上角为原点 水平 右 为x轴 纵向 下 为y轴 3D图形学习中通常使用另一种坐标系 即 正中心为原点 水平 右 为x轴 纵向 上 为y轴 当前者坐标系转化到后者 需要进行简单的转化 Sx Sy为
  • IDEA2021.2安装与配置(持续更新)

    IDEA2021 2安装与配置 持续更新 一 下载 二 安装 三 配置 3 1 配置全局生效 3 2 首次启动 3 3 激活 3 4 字体 字体大小 3 5 配色方案 3 6 注解生效 3 7 自动导包移包 3 8 自动补全快捷键 3 9
  • vue-nginx刷新404问题

    文章目录 1 背景介绍 2 问题描述 2 1 问题一 2 2 问题二 3 原因分析 3 1 问题一 3 2 问题二 4 排查问题一原因 5 反思 6 nginx root与alias的使用 7 更优雅地解决vue网页浏览器刷新404 7 1
  • Mongodb——使用Mongodb对字段中字符串内容进行截取,并进行分组统计

    最近忙的厉害 除了发一发之前写的存货只能写一些简单的东西了 这里就简单分享下最近遇见针对数据进行指标统计遇见的问题 针对字段中某部分内容的指标统计 在使用mongodb进行指标统计的时候可能遇见下面的数据结构 1 id ObjectId 5