MongoDB forEach函数中ObjectId无法转换为String问题排查
MongoDB跨集合查询ObjectId转字符串方法环境兼容性问题
基础信息
- 实现需求:通过
cursor.forEach实现MongoDB跨集合数据处理,匹配reward_order集合中与reward集合记录关联的订单,打印对应订单状态 - 运行环境:
- 客户端工具:DataGrip 2021.3.1
- MongoDB服务端版本:4.4.9
- 初始执行脚本:
db.reward.find({type: "Test"}).forEach( function (p) { db.reward_order.find({rewardId: p._id.valueOf()}).forEach( function (order) { print(order.status) } ); } );
问题描述
两个关联字段类型不匹配:reward集合返回的p._id为ObjectId类型,reward_order集合的rewardId字段为字符串类型。参考公开方案调用p._id.valueOf()做类型转换时执行失败,报错信息如下:
TypeError: invokeMember (valueOf) on org.bson.types.ObjectId@5d2a6048 failed due to: Unknown identifier: valueOf
TypeError: invokeMember (valueOf) on org.bson.types.ObjectId@5d2a6048 failed due to: Unknown identifier: valueOf
at user_script:46:67
at _ex (user_script:42:25)
at Cursor.forEach (all-standalone.js:155221: ...
多环境兼容性测试结果(6月24日更新)
对常见的ObjectId转字符串方案做了跨环境验证,设a为ObjectId类型值,测试结果如下:
- mongosh环境:
a.toString():可正常返回字符串类型IDa.valueOf():返回值仍为ObjectId类型对象,未实现类型转换a.str属性:返回undefined,无法使用
- DataGrip环境:
- 上述常见转换方法全部失效,目前仅通过拼接空字符串的写法
p._id + ''可成功完成ObjectId到字符串的转换
- 上述常见转换方法全部失效,目前仅通过拼接空字符串的写法
存在疑问:实际方法的执行表现与MongoDB官方文档描述存在明显差异,需要明确出现该差异的根本原因。
内容的提问来源于stack exchange,提问作者Richard
相关产品推荐
相关产品推荐

