如何在Pentaho Data Integrator中用MongoDB getTimestamp()提取ObjectId时间戳
解决Pentaho中MongoDB ObjectId获取创建时间戳返回null的问题
问题原因
Pentaho的MongoDB输入组件不支持在JSON路径里直接调用MongoDB的getTimestamp()方法——这个方法是MongoDB驱动提供的对象方法,不属于JSON查询语法范畴,所以直接写$._id.getTimestamp()会返回null。
两种可行解决方案
1. 用MongoDB聚合查询直接生成时间字段
在MongoDB输入组件的查询框中,使用聚合管道的$project阶段,直接将_id转换为日期字段,示例聚合语句:
[ { $project: { // 保留业务需要的其他字段,比如name、age name: 1, age: 1, create_time: { $toDate: "$_id" } // 将ObjectId转为标准日期,MongoDB 4.0+支持 } } ]
配置完成后,组件会直接输出create_time字段,可直接用于增量同步的时间判断。
2. 在Pentaho中通过脚本转换处理
如果不想修改MongoDB查询,可在MongoDB输入组件后添加JavaScript值组件,通过脚本提取_id中的时间戳:
// 提取ObjectId前8位十六进制字符,转换为时间戳 var timestampHex = _id.substring(0, 8); var timestamp = parseInt(timestampHex, 16) * 1000; // 转换为日期对象 create_time = new Date(timestamp);
将create_time设为输出字段,后续即可用这个字段做增量过滤。
额外注意
- 若使用的MongoDB版本低于4.0,不支持
$toDate,可改用$add实现转换:create_time: { $add: [new Date(0), { $multiply: [ { $toLong: { $substrCP: ["$_id", 0, 8] } }, 1000 ] } ] } - 确保Pentaho读取
_id时字段类型为字符串,避免驱动解析为特殊对象导致脚本处理失败。
内容的提问来源于stack exchange,提问作者Mesut Gul
相关产品推荐
相关产品推荐

