MongoDB查询中使用ObjectID是否必须搭配new关键字?
MongoDB ObjectID 调用时加不加new关键字的差异说明
两种写法的最终执行效果完全一致,不存在功能、内存层面的实质区别,都可以正常匹配_id字段完成posts集合的文档删除操作,所谓的差异仅存在于驱动内部的兼容逻辑层:
- 构造函数兼容设计:MongoDB Node.js驱动很早就对ObjectID做了调用兼容处理,当你不写new、直接把ObjectID当普通函数调用时,函数内部会自动判断当前调用上下文,如果发现不是构造函数调用场景,会主动返回
new ObjectID(入参)的实例结果,也就是说两种写法最终拿到的ObjectID实例,属性、方法、取值完全一模一样。 - 内存表现无区别:因为不带new的调用本质上最终还是走了new实例化的流程,不存在对象复用、内存泄漏、内存占用高低的问题,两种写法的内存分配、后续垃圾回收逻辑没有任何差别。
- 仅TS类型校验存在版本差异:在3.x及更早版本的MongoDB驱动TS类型定义里,不带new的调用方式可能会触发TS类型报错,加new的写法可以兼容所有历史版本的类型检查;4.x及以上的新版本驱动已经补全了两种调用方式的类型声明,不会再出现类型提示异常。
两种写法的代码对比如下:
// 不使用new关键字 const resData: DeleteWriteOpResultObject = await data .collection("posts") .deleteOne({ _id: ObjectID(req.params.id), }); // 使用new关键字 const resData: DeleteWriteOpResultObject = await data .collection("posts") .deleteOne({ _id: new ObjectID(req.params.id), });
日常开发只需要跟着团队代码规范统一选一种写法就行,不需要担心执行结果出问题。查阅MongoDB官方TypeScript使用教程的相关内容,也明确标注了两种写法均为官方认可的合法调用方式,不存在行为差异。
内容的提问来源于stack exchange,提问作者Aniruddha Ghosh
相关产品推荐
相关产品推荐

