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

MongoDB聚合:如何将动态日志字段从对象转为字符串

解决方案

要实现将动态的logs字段值从对象转为指定格式的字符串,需要调整聚合管道逻辑,核心是先把对象转成数组批量处理,再转回对象结构,具体实现如下:

完整聚合查询语句

collection.aggregate([
  { $match: { _id: { $exists: true } } },
  // 将logs对象转为[{k: 时间字符串, v: {temp, humidity}}]格式的数组
  { $addFields: { logsArray: { $objectToArray: "$logs" } } },
  // 遍历数组,把每个v中的temp和humidity拼接成"数字, 数字"格式的字符串
  {
    $addFields: {
      logsArray: {
        $map: {
          input: "$logsArray",
          as: "item",
          in: {
            k: "$$item.k",
            v: {
              $concat: [
                { $toString: "$$item.v.temp" },
                ", ",
                { $toString: "$$item.v.humidity" }
              ]
            }
          }
        }
      }
    }
  },
  // 将处理后的数组转回对象,得到动态键对应字符串的结构
  { $addFields: { formattedLogs: { $arrayToObject: "$logsArray" } } },
  // 合并原文档的固定字段和格式化后的logs对象,替换为根节点
  {
    $replaceRoot: {
      newRoot: {
        $mergeObjects: [
          { _id: "$_id", category: "$category", city: "$city", date: "$date" },
          "$formattedLogs"
        ]
      }
    }
  }
])

关键步骤说明

  • $objectToArray:把logs这个动态键值对对象转换成数组结构,让动态字段能被批量遍历处理。
  • $map:遍历数组中的每个元素,将temp和humidity数字转为字符串后拼接成目标格式,同时保留原时间字段名。
  • $arrayToObject:把处理后的数组重新转回对象结构,此时每个时间字段对应的值已经是拼接好的字符串。
  • $mergeObjects:将原文档的固定字段(_id、category等)和格式化后的logs对象合并,最终输出符合要求的文档结构。

内容的提问来源于stack exchange,提问作者equallyhero

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 08:15:34