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

如何用MongoDB聚合从字符串提取数字并转换为小时小数

MongoDB聚合处理时长字符串为小数小时数

完全可以通过MongoDB聚合管道实现这个需求,核心是利用字符串正则匹配、数值转换和算术运算完成转换。以下是具体的聚合脚本:

db.collection.aggregate([
  {
    $addFields: {
      // 提取小时数:匹配hr前的数字,无匹配则为0
      hours: {
        $convert: {
          input: { $arrayElemAt: [{ $regexFindAll: { input: "$value", regex: /(\d+)\s*hr/ } }, 0] },
          to: "double",
          onError: 0,
          onNull: 0
        }
      },
      // 提取分钟数:匹配mins前的数字,无匹配则为0
      minutes: {
        $convert: {
          input: { $arrayElemAt: [{ $regexFindAll: { input: "$value", regex: /(\d+)\s*mins/ } }, 0] },
          to: "double",
          onError: 0,
          onNull: 0
        }
      }
    }
  },
  {
    $addFields: {
      // 计算总小时数:分钟转小时后与小时数相加,保留两位小数
      value: {
        $round: [
          { $add: ["$hours", { $divide: ["$minutes", 60] }] },
          2
        ]
      }
    }
  },
  // 移除临时字段
  { $project: { hours: 0, minutes: 0 } }
])

步骤说明:

  • 提取小时和分钟数:通过$regexFindAll匹配字符串中对应单位前的数字,用$arrayElemAt取出匹配结果,再通过$convert转为数值;如果没有匹配到对应单位(比如只有分钟或只有小时),则默认赋值为0。
  • 计算小数形式总小时:把分钟数除以60转换为小时单位,和提取到的小时数相加,最后用$round保留两位小数,和示例结果的精度一致。
  • 清理临时字段:移除聚合过程中生成的hours和minutes临时字段,只保留原始的_id和转换后的value字段。

执行该聚合管道后,会得到预期结果:

{ _id: 1, value: 25.03 },
{ _id: 2, value: 25.6 },
{ _id: 3, value: 0.5 },
{ _id: 4, value: 5 }

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 09:54:15