MST

星途 面试题库

面试题:MongoDB中结合max与min累加器函数处理复杂数据结构

假设有一个集合students,每个文档包含一个scores数组,数组中每个元素是一个对象,包含subject(科目)和score(分数)字段。要求使用聚合操作,找出每个学生所有科目中的最高分数和最低分数,并以{student_id: xxx, max_score: xxx, min_score: xxx}的格式输出结果,说明max和min累加器函数在此过程中的使用要点及可能遇到的问题。
30.6万 热度难度
数据库MongoDB

知识考点

AI 面试

面试题答案

一键面试
  1. 聚合操作实现
    db.students.aggregate([
        {
            $unwind: "$scores"
        },
        {
            $group: {
                _id: "$_id",
                max_score: {
                    $max: "$scores.score"
                },
                min_score: {
                    $min: "$scores.score"
                }
            }
        },
        {
            $project: {
                student_id: "$_id",
                max_score: 1,
                min_score: 1,
                _id: 0
            }
        }
    ]);
    
  2. maxmin累加器函数使用要点
    • 使用要点
      • $max$min函数用于在$group阶段对分组后的数据进行操作。$max函数会遍历分组内的文档,找出指定字段(这里是scores.score)的最大值,$min函数则找出最小值。
      • 它们只能在$group阶段使用,并且需要与$group_id字段配合使用,_id字段定义了分组的依据,这里以学生的_id进行分组,这样就可以针对每个学生分别计算最高和最低分数。
    • 可能遇到的问题
      • 数据类型不一致:如果scores.score字段的数据类型不一致,例如部分是数字,部分是字符串,$max$min操作可能会得到意外结果或者报错。在使用前需要确保scores.score字段的数据类型统一为数值类型。
      • 空数组情况:如果某个学生的scores数组为空,$max$min函数可能返回null。在实际应用中,需要根据业务需求决定如何处理这种情况,比如可以在聚合前增加过滤阶段,过滤掉scores数组为空的文档,或者在结果处理阶段对null值进行特殊处理。