为MongoDB集合各文档制作Grafana时序图遇格式识别问题求助
解决Grafana无法识别MongoDB时序数据的问题
问题分析
你当前的聚合查询把每个文档的所有数据点打包到datapoints数组中,这种嵌套结构不符合Grafana MongoDB数据源对时序数据的解析要求,Grafana更适配每个数据点作为独立文档的扁平结构,同时需要明确的metric标识来区分时序系列。
修改后的聚合查询
human_pos.POS.aggregate([ {"$match": {"FRAME": {"$exists": true}}}, {"$project": { "data": { "$zip": { "inputs": ["$FRAME", "$NOSE_Y"] } }, "doc_id": "$_id" }}, {"$unwind": "$data"}, {"$project": { "time": {"$multiply": [{"$arrayElemAt": ["$data", 0]}, 1000]}, "value": {"$arrayElemAt": ["$data", 1]}, "metric": "nose_y_position", "doc_id": 1, "_id": 0 }}, {"$sort": {"time": 1}} ])
关键调整说明
- 移除最后的
$group阶段:直接输出每个FRAME-NOSE_Y对作为独立文档,Grafana可直接解析这种结构 - 添加
metric字段:Grafana时序图需要该字段标识数据系列,可根据需求修改名称 - 保留
doc_id作为标签:方便在Grafana中按不同原始文档(比如不同的人体追踪记录)过滤或区分多条时序曲线
Grafana配置步骤
- 在MongoDB查询面板中,设置
Format as: Time series - 字段映射:
- Time字段选择
time - Value字段选择
value - Metric字段选择
metric - 可选:将
doc_id添加为Tag,用于区分不同系列
- Time字段选择
额外优化(可选)
如果你的FRAME是帧率单位(比如30帧/秒),想要将X轴转换为实际时间偏移而非1970年起始的时间戳,可以修改time的计算逻辑:
"time": {"$multiply": [{"$arrayElemAt": ["$data", 0]}, 1000/30]} // 30为帧率,根据实际情况调整
同时在Grafana图表的X轴设置中,将Mode从Time改为Series,即可显示相对时间轴。
内容的提问来源于stack exchange,提问作者Chan Kim
相关产品推荐
相关产品推荐

