0

0

MongoDB 聚合:将二维数组转换为各子数组长度组成的一维数组

花韻仙語

花韻仙語

发布时间:2026-01-15 13:36:25

|

674人浏览过

|

来源于php中文网

原创

MongoDB 聚合:将二维数组转换为各子数组长度组成的一维数组

本文介绍如何使用 mongodb 聚合管道(特别是 `$map` 和 `$size`)将存储答题结果的二维数组(如 `results: [["u1","u2"], [], ["u3","u4","u5"], ["u6"]]`)高效转换为对应子数组长度的一维数组(如 `[2, 0, 3, 1]`),完全适配动态题干选项数量(2–5 个)。

在基于 MongoDB 构建的在线测验系统中,常采用二维数组结构存储用户选择行为:外层数组每个位置对应一个预设答案选项,内层数组则存放选中该选项的用户 ID 列表。例如:

{ "results": [["10938381", "10938382"], [], ["10938383", "10938384", "10938385"], ["10938386"]] }

目标是将其聚合为统计维度——即每个选项被选择的次数,生成形如 { "results": [2, 0, 3, 1] } 的结果。关键在于:不依赖固定长度,支持任意长度的外层数组(2–5 项)

✅ 推荐方案:$map + $size

使用 $map 遍历 results 数组的每一项(即每个子数组),对每项应用 $size 运算符获取其元素个数,最终输出长度一致的新数组:

数组应用&二维数组 word版
数组应用&二维数组 word版

所谓数组,就是相同数据类型的元素按一定顺序排列的集合,就是把有限个类型相同的变量用一个名字命名,然后用编号区分他们的变量的集合,这个名字称为数组名,编号称为下标。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。数组是在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来的一种形式。这些按序排列的同类数据元素的集合称为数组。 数组应用&二维数组目录 1. 数组的简单应用2. 数组排序3. 数组查找4. 数组的使用思想5. 查表法6. 二维数组7. 数组综合

下载
YourModel.aggregate([
  {
    $project: {
      results: {
        $map: {
          input: "$results",
          in: { $size: "$$this" }
        }
      }
    }
  }
]);
  • $map 是 MongoDB 中专用于数组映射的表达式操作符;
  • input: "$results" 指定待处理的源数组;
  • in: { $size: "$$this" } 表示对当前遍历项(用 $$this 引用)计算其大小;
  • 该操作天然支持变长数组,无论 results 包含 2、3、4 或 5 个子数组,均能正确输出等长的整数数组。

⚠️ 注意事项

  • 确保 results 字段始终为数组类型(空数组 [] 也合法),若存在 null 或缺失字段,$size 将返回 0(MongoDB 行为),建议在写入时做数据校验;
  • 若需同时保留原始 results 并新增统计字段(如 voteCounts),可改用别名投影:
    { $project: { voteCounts: { $map: { input: "$results", in: { $size: "$$this" } } } } }
  • 在 Mongoose 中调用时,确保模型已正确定义 results 的 Schema 类型(推荐 [[String]] 或 Array(Array(String)))以获得 TypeScript 支持与运行时校验。

该方案简洁、高效、无副作用,无需 $unwind/$group 等重量级阶段,适用于高并发实时统计场景,是处理此类“数组长度映射”需求的标准实践。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

315

2023.08.02

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

231

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

436

2024.03.01

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1465

2023.10.24

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

228

2024.02.23

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

85

2025.10.17

golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

75

2025.09.05

golang map相关教程
golang map相关教程

本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。

32

2025.11.16

Golang gRPC 服务开发与Protobuf实战
Golang gRPC 服务开发与Protobuf实战

本专题系统讲解 Golang 在 gRPC 服务开发中的完整实践,涵盖 Protobuf 定义与代码生成、gRPC 服务端与客户端实现、流式 RPC(Unary/Server/Client/Bidirectional)、错误处理、拦截器、中间件以及与 HTTP/REST 的对接方案。通过实际案例,帮助学习者掌握 使用 Go 构建高性能、强类型、可扩展的 RPC 服务体系,适用于微服务与内部系统通信场景。

8

2026.01.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 3.7万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号