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对字段中字符串内容进行截取,并进行分组统计 的相关文章

  • 数据挖掘工程师主要做什么?

    转自 微点阅读 https www weidianyuedu com content 5317504350632 html 数据挖掘工程师负责科技数据挖掘算法模型的构建 应用 评测 报告 下面是第一范文网小编为您精心整理的数据挖掘工程师的基
  • iOS中的数据持久化方式

    iOS中的数据持久化方式 基本上有以下四种 属性列表 对象归档 SQLite3和Core Data 1 属性列表 涉及到的主要类 NSUserDefaults 一般 NSUserDefaults standardUserDefaults 就
  • MongoDB—索引的建立与维护

    一 索引基础 MongoDB的索引几乎与传统的关系型数据库一模一样 这其中也包括一些基本的优化技巧 下面是创建索引的命令 gt db test ensureIndex username 1 可以通过下面的名称查看索引是否已经成功建立 gt
  • Python JSON格式处理

    从外部读入的json经过loads反序列化后可以转换为dict类型的数据 dict类型的数据可以通过dumps转换为json格式的数据 param self request body decode utf 8 dict data json
  • BDA初级分析——数据收集、清洗和整理

    一 认识数据 什么是数据 数据是对客观世界的记录 用来记载事物的性质 状态 相互关系等 有哪些常见的数据类型 什么是数据集 数据集 数据的集合 通常以表格形式出现 二 收集数据 我们都会从哪里收集数据 内部数据 外部数据 收集数据的注意事项
  • Webservice接口数据抽取_kettel<一>

    在进行ETl数据抽取的时 有时会遇到Webservice接口服务的情况 这里对kettel工具和java脚本两种抽取方式来简单的介绍一下 由于篇幅较长 我分四篇来介绍 下一篇地址 Webservice接口数据抽取 kettel lt 二 g
  • 内存对齐,导致char型数组指针转化为float型指针出现的问题

    前阵子在做一个无线调参软件时 需要把一个float型的变量从上位机 qt平台编写 发给下位机 stm32 然后我采取的做法是将储存float变量的四个字节里面的数据通过串口以此发给下位机 然后下位机用一个char 4 数组进行接收 然后将c
  • Oracle 错误 maximum number of processes(150) exceeded 解决办法

    只保留以上服务 关掉其他没用的服务即可
  • 数据学习(十四)-方差分析与试验设计

    1 方差分析引论 2 单因素方差分析 3 方差分析中的多重比较 4 双因素方差分析 5 试验设计初步 1 方差分析引论 方差分析是比较多个总体的均值是否相等 但本质上它所研究的是变量之间的关系 1 1 方差分析及其有关术语 检验多个总体均值
  • 用R建立岭回归和lasso回归

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

    直接上源码 package com gxy pojo model import java util Date import javax persistence Column import javax persistence Entity i
  • 【elasticsearch】ES 单分片使用 From/Size 分页遇到重复数据

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

    借最近上课实习上机内容 来介绍MODIS数据相关方面内容 本部分主要包括了MODIS数据的简介和下载的问题 本篇是第一部分 MODIS的简介 主要分为三个部分 1 MODIS传感器简介及参数 2 MODIS产品及命名规则 3 MODIS的典
  • 【计算机网络】数据通信的基础知识

    通信系统的一般模型 数据通信系统的组成部分 源点 信源 产生数据 如从键盘输入 产生数字比特流 发送器 对数字比特流进行编码 如调制器 信道 是信号传输的通道 可能是一条简易的传输线路 也可能是一个复杂的网络 接收器 设备的功能与发送设备相
  • kafka权威指南中文版之三

    第三章kafka producer 向kafka写入消息 无论你将kafka作为一个消息队列 或者消息总线 还是一个数据存储平台 你都要通过生产者producer向kafka写入数据 通过消费者consumer读取kafka的数据 例如 一
  • json数组如何转换成string类型(超级好用)

    先上代码 下面解释 这个jar包地址之后更新的时候再给出来的 包的地址 JSONObject job ace text a 此时job里面的数据格式为 logid 2075 words result words acb words and
  • clickhouse insert的数据结构

    clickhouse insert大致分为两部分 1 sql语句部分 insert into table f1 f2 2 数据部分 数据部分又分为3部分 头 数据 尾 数据头 数据块1 数据块2 数据块N 数据尾 从中可以看出 每个inse
  • C/C++编程题开头字符串、数据输入几种写法

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

    最近在实施一个项目 其中一项工作是处理历史数据 客户提供过来的数据是excel表格 超过20万条记录 由于目标系统导入限制 每次只能导入大小不超过8M的文件 所以需要对这些数据进行分割处理 在手工处理一遍后 觉得可以通过写一个程序来自动实现
  • MES11大标准模块(ISA95)

    1 资源分配及状态管理 ResourceAllocationandStatus 该功能管理机床 工具 人员物料 其它设备以及其它生产实体 满足生产计划的要求对其所作的预定和调度 用以保证生产的正常进行 提供资源使用情况的历史记录和实时状态信

随机推荐

  • 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