首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >MongoDB的行转列查询

MongoDB的行转列查询

作者头像
用户11690639
发布2026-06-18 07:54:20
发布2026-06-18 07:54:20
210
举报

项目组数据需求,需要将Mongo库中的列按日期分组转成行的格式进行显示。Mongo群里问了下,群里热心的大佬小徐 同学果断出手相助,顺利解决了数据问题。现将内容总结梳理如下,帮助有需要的其他同学

表结构

建表语句

代码语言:javascript
复制
db.class.insertMany( [
{ studentId: 1, class: "CLASS ONE", subject: "English", SCORE: 90 },
{ studentId: 1, class: "CLASS ONE", subject: "Math", SCORE: 100 },
{ studentId: 1, class: "CLASS ONE", subject: "PE", SCORE: 40 },
{ studentId: 2, class: "CLASS ONE", subject: "PE", SCORE: 80 },
{ studentId: 2, class: "CLASS ONE", subject: "English", SCORE: 95 },
{ studentId: 2, class: "CLASS ONE", subject: "Math", SCORE: 100 }
] )

表结构截图

在这里插入图片描述
在这里插入图片描述

期望数据展示

class

studentId

Enlish

Math

PE

CLASS ONE

1

90

100

40

CLASS ONE

2

95

100

80

查询语句

1. addFields方法

思路分为以下几步 (1)用addFields方法增加一个字段obj,用来存放学科和分数对象

在这里插入图片描述
在这里插入图片描述

(2)用学生ID进行分组,并将学生的所有的obj对象放到一个数组里

在这里插入图片描述
在这里插入图片描述

(3)将学生ID信息也以键值对的形式合并到数组中进行展现

在这里插入图片描述
在这里插入图片描述

(4)替换掉所有k,v形式,将上述的数组对象Item2以对象的形式展现

在这里插入图片描述
在这里插入图片描述

完整的查询语句如下所示

代码语言:javascript
复制
db.class.aggregate([
    { $addFields: { obj: { k: "$subject", v: "$SCORE" } } },
    { $group: { _id: "$studentId", item: { $push: "$obj" } } },
    {
        $project: {
            item2: {
                $concatArrays: [[{ k: "studentId", v: "$_id" }
                ], "$item"]
            }
        }
    },
    { $replaceWith: { $arrayToObject: "$item2" } }])
2. 不用addFields方法

思路同上 (1)分组将学科和分数以数组的形式放在一个字段item中 (2)将学生ID信息放到数组item中里,返回一个新的数组对象item2 (3) 将item2数组转对对象文档,将通过replaceWith将其k,v替换成字段和值的形式展现

代码语言:javascript
复制
db.class.aggregate([
    { $group: { _id: "$studentId", item: { $push: { k: "$subject", v: "$SCORE" } } } },
    { $project: { item2: { $concatArrays: [[{ k: "_id", v: "$_id" }], "$item"] } } },
    { $replaceWith: { $arrayToObject: "$item2" } }])
3

思路: (1)用学生ID分组,将学科分值合并成一个数组并将其放到数组对象item中

在这里插入图片描述
在这里插入图片描述

(2) 将学生ID信息合并到item中,组成新的数组对象item2

在这里插入图片描述
在这里插入图片描述

(3)将数组对象item2以对象的形式展示,并通过replaceWith函数替换字段值的方式展示结果

在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
db.class.aggregate([
    { $group: { _id: "$studentId", item: { $push: { "$concatArrays": [["$subject"], ["$SCORE"]] } } } }, 
    { $project: { item2: { $concatArrays: [[["_id", "$_id"]], "$item"] } } }, 
    { $replaceWith: { $arrayToObject: "$item2" } }
    ])

下面小尝试了下mapReduce

查询每个学生的总分

代码语言:javascript
复制
db.class.mapReduce(
    function() { emit(this.studentId, this.SCORE) } // map 函数
    , function(key, value) { return Array.sum(value) }, //reduce函数
    {
        out: "test.classTotalScore"
    })
db.test.classTotalScore.find()
在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2026-06-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 表结构
    • 建表语句
    • 表结构截图
    • 期望数据展示
    • 查询语句
      • 1. addFields方法
      • 2. 不用addFields方法
      • 3
  • 下面小尝试了下mapReduce
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档