You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Node.js+MongoDB查询返回列数据而非行数据

你现在自定义的toJSON是处理单条MongoDB文档的序列化逻辑,要得到按列组织的格式,不需要修改原有toJSON实现,只需要在拿到查询返回的行数组后做一次结构转换即可,具体实现如下:

步骤1:编写行转列转换函数

// 定义需要提取的目标字段列表,和你期望返回的字段对应
const targetFields = ['username', 'heartrate', 'bodytemperature', 'bloodoxygen', 'bloodpressure']

// rowArr 就是你查询得到的原始行对象数组
const transformToColumn = (rowArr) => {
  // 初始化结果对象,每个字段对应一个空数组
  const result = targetFields.reduce((acc, field) => {
    acc[field] = []
    return acc
  }, {})

  // 遍历所有行数据,依次把值塞入对应字段的数组
  rowArr.forEach(row => {
    targetFields.forEach(field => {
      result[field].push(row[field])
    })
  })

  return result
}

步骤2:查询后调用转换函数即可

// 替换为你自己的业务查询逻辑
const rawData = await YourModel.find({ username: '2' })
const columnData = transformToColumn(rawData)
// 此时columnData就是你期望的按列组织的格式

可选优化:动态生成字段列表

如果你不想硬编码目标字段,也可以通过排除不需要的字段动态生成规则:

const transformToColumn = (rowArr) => {
  if (!rowArr.length) return {}
  // 定义需要排除的非业务字段
  const excludeFields = ['createdAt', 'updatedAt', '__v', 'id']
  // 从第一条数据动态提取要保留的字段
  const targetFields = Object.keys(rowArr[0]).filter(field => !excludeFields.includes(field))
  
  const result = targetFields.reduce((acc, field) => {
    acc[field] = []
    return acc
  }, {})

  rowArr.forEach(row => {
    targetFields.forEach(field => {
      result[field].push(row[field])
    })
  })

  return result
}

内容的提问来源于stack exchange,提问作者pl-jay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 04:09:03