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

MongoDB中基于时间字段计算Total_ti的实现方法咨询

需求说明

需要基于ti字段计算Total_ti,计算Total_ti时需取首个文档的ts字段值、末尾文档的te字段值作为汇总记录的对应字段值,其余原有文档内容保持不变。

输入文档示例

[
  {
    "ts": "2021-09-04T12:18:41Z",
    "te": "2021-09-04T14:59:50Z",
    "td": "2021-09-04",
    "ti": 2.69
  },
  {
    "ts": "2021-09-04T15:00:00Z",
    "te": "2021-09-04T15:05:00Z",
    "td": "2021-09-04",
    "ti": 0.08
  },
  {
    "ts": "2021-09-04T15:40:00Z",
    "te": "2021-09-04T16:00:00Z",
    "td": "2021-09-04",
    "ti": 0.33
  }
]

预期输出文档示例

[
 {
    "ts": "2021-09-04T12:18:41Z",
    "te": "2021-09-04T16:00:00Z",
    "Total_ti": 3.10
    },
  {
    "ts": "2021-09-04T12:18:41Z",
    "te": "2021-09-04T14:59:50Z",
    "td": "2021-09-04",
    "ti": 2.69
  },
  {
    "ts": "2021-09-04T15:00:00Z",
    "te": "2021-09-04T15:05:00Z",
    "td": "2021-09-04",
    "ti": 0.08
  },
  {
    "ts": "2021-09-04T15:40:00Z",
    "te": "2021-09-04T16:00:00Z",
    "td": "2021-09-04",
    "ti": 0.33
  }
]

Python实现代码

import json
from decimal import Decimal, ROUND_HALF_UP

def process_docs(doc_list):
    # 计算ti总和,用Decimal避免浮点数精度误差,保留两位小数
    total = sum(Decimal(str(item["ti"])) for item in doc_list)
    total_ti = float(total.quantize(Decimal("0.00"), rounding=ROUND_HALF_UP))
    # 构造首条汇总记录
    summary = {
        "ts": doc_list[0]["ts"],
        "te": doc_list[-1]["te"],
        "Total_ti": total_ti
    }
    # 汇总记录前置,拼接原有数据
    return [summary] + doc_list

# 测试运行
if __name__ == "__main__":
    # 替换这里的输入内容即可处理实际数据
    input_data = json.loads("""
    [
      {
        "ts": "2021-09-04T12:18:41Z",
        "te": "2021-09-04T14:59:50Z",
        "td": "2021-09-04",
        "ti": 2.69
      },
      {
        "ts": "2021-09-04T15:00:00Z",
        "te": "2021-09-04T15:05:00Z",
        "td": "2021-09-04",
        "ti": 0.08
      },
      {
        "ts": "2021-09-04T15:40:00Z",
        "te": "2021-09-04T16:00:00Z",
        "td": "2021-09-04",
        "ti": 0.33
      }
    ]
    """)
    output = process_docs(input_data)
    print(json.dumps(output, indent=2, ensure_ascii=False))

注意要点

  • 用Decimal处理浮点数求和,避免出现0.1+0.2=0.30000000000000004这类精度问题
  • 原有文档内容完全保留,不会做任何修改
  • 汇总记录固定放在返回数组的第一个位置

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 21:39:01