如何用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
相关产品推荐
相关产品推荐

