本文介绍如何使用 mongodb 聚合管道(特别是 `$map` 和 `$size`)将存储答题结果的二维数组(如 `results: [["u1","u2"], [], ["u3","u4","u5"], ["u6"]]`)高效转换为对应子数组长度的一维数组(如 `[2, 0,

在基于 MongoDB 构建的在线测验系统中,常采用二维数组结构存储用户选择行为:外层数组每个位置对应一个预设答案选项,内层数组则存放选中该选项的用户 ID 列表。例如:
{ "results": [["10938381", "10938382"], [], ["10938383", "10938384", "10938385"], ["10938386"]] }目标是将其聚合为统计维度——即每个选项被选择的次数,生成形如 { "results": [2, 0, 3, 1] } 的结果。关键在于:不依赖固定长度,支持任意长度的外层数组(2–5 项)。
使用 $map 遍历 results 数组的每一项(即每个子数组),对每项应用 $size 运算符获取其元素个数,最终输出长度一致的新数组:
YourModel.aggregate([
{
$project: {
results: {
$map: {
input: "$results",
in: { $size: "$$this" }
}
}
}
}
]);{ $project: { voteCounts: { $map: { input: "$results", in: { $size: "$$this" } } } } }该方案简洁、高效、无副作用,无需 $unwind/$group 等重量级阶段,适用于高并发实时统计场景,是处理此类“数组长度映射”需求的标准实践。