MongoDB 聚合:将二维数组映射为各子数组长度构成的一维数组

秋涛大大_8303

秋涛大大_8303

2026-01-15

624人浏览

原创

MongoDB 聚合:将二维数组映射为各子数组长度构成的一维数组

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

在构建在线测验系统时,常将用户选择以二维数组形式结构化存储:外层数组每个位置对应一个选项,内层数组存放选中该选项的用户 ID。例如:

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

目标是将其聚合为各选项被选次数的统计数组 [2, 0, 3, 1] —— 这一需求不依赖固定长度,必须兼容 2 至 5 个选项的任意配置。

MongoDB 原生支持函数式数组变换,推荐使用 $map 配合 $size 实现零侵入、高性能的转换:

Model.aggregate([
  {
    $project: {
      results: {
        $map: {
          input: "$results",
          in: { $size: "$$this" }
        }
      }
    }
  }
]);
  • $map 遍历 "$results" 的每一项(即每个用户 ID 子数组);
  • $$this 指代当前遍历的子数组;
  • $size 直接返回该子数组的元素个数(空数组返回 0);
  • 最终输出字段 results 被重写为纯数字数组,长度与原始外层数组一致。

✅ 优势说明:

Teams Delegate
Teams Delegate

将Microsoft Teams收件箱管理委托给AI代理,实现自动回复、消息摘要、优先级筛选及情境感知响应。

下载
  • ✅ 完全动态:无需预设子数组数量,自动适配任意长度的 results;
  • ✅ 高效可靠:单阶段完成,无 $unwind 导致的文档膨胀,性能稳定;
  • ✅ 兼容 Mongoose:可直接在 .aggregate() 链中调用,返回结果与原 schema 字段名一致;
  • ✅ 可扩展:后续可轻松叠加 $addFields 或 $group 进行全局统计(如总答题人数、最高选中率等)。

⚠️ 注意事项:

  • 确保 results 字段始终为数组类型(可在 Schema 中定义 results: [[String]]);
  • 若存在 null 或缺失 results 字段,建议前置 $ifNull 处理,例如:input: { $ifNull: ["$results", []] };
  • 在生产环境聚合前,建议使用 .explain("executionStats") 验证性能,尤其当集合量级较大时。

该方案简洁、健壮且符合 MongoDB 的声明式设计哲学,是处理此类“数组维度降维统计”问题的标准实践。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

mongodb gate

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
string转int
string转int

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

2023.08.02

7559

3

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

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

2023.09.22

569

3

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

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

2024.03.01

1698

6

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

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

2025.09.05

750

5

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

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

2025.11.16

343

7

golang map原理
golang map原理

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

2025.11.17

553

20

java判断map相关教程
java判断map相关教程

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

2025.11.27

323

6

点击input框没有光标怎么办
点击input框没有光标怎么办

点击input框没有光标的解决办法:1、确认输入框焦点;2、清除浏览器缓存;3、更新浏览器;4、使用JavaScript;5、检查硬件设备;6、检查输入框属性;7、调试JavaScript代码;8、检查页面其他元素;9、考虑浏览器兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.11.24

974

4

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

935

5

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go-Zero HTTP服务开发指南
Go-Zero HTTP服务开发指南

共0课时 | 0人学习

Go-Zero goctl安装与使用手册
Go-Zero goctl安装与使用手册

共0课时 | 0人学习

Go-Zero框架快速开始指南
Go-Zero框架快速开始指南

共0课时 | 0人学习