使用MongoDB ObjectId查询产品遇废弃警告,如何改用createFromTime()?
MongoDB ObjectId构造函数废弃后的替代方案
问题描述
ObjectId的签名(inputId: number): ObjectId已被废弃,官方提示使用静态方法createFromTime()为新的ObjectId设置数值。当前使用如下代码查询单个产品时,new ObjectId(product_id)出现删除线样式,尽管能正常获取查询结果,希望了解如何改用createFromTime()方法:
const { ObjectId } = require('mongodb'); static findById(product_id) { // console.log("Collected product id:",product_id); //db is the database return db.collection('Product_data').find({"_id":new ObjectId(product_id)}).next() .then(singleData=>{ return singleData; }) .catch(err=>{ console.log("Product not found",err) }) }
解决方案
需要根据product_id的实际类型选择对应的替代方法:
1. 若product_id是时间戳数字
被废弃的是接收数字参数的ObjectId构造函数,此时直接用ObjectId.createFromTime()静态方法替代即可,该方法会基于传入的时间戳生成对应的ObjectId:
const { ObjectId } = require('mongodb'); static findById(product_id) { return db.collection('Product_data').find({"_id": ObjectId.createFromTime(product_id)}) .next() .catch(err => { console.log("Product not found", err); }); }
2. 若product_id是标准24字符ObjectId字符串
这种情况下,接收字符串参数的ObjectId构造函数并未被废弃,出现删除线大概率是类型检查工具(如TypeScript)的误判。如果想严格遵循官方静态方法的使用规范,可以改用ObjectId.createFromHexString()(专门用于从十六进制字符串创建ObjectId),代码修改如下:
const { ObjectId } = require('mongodb'); static findById(product_id) { return db.collection('Product_data').find({"_id": ObjectId.createFromHexString(product_id)}) .next() .catch(err => { console.log("Product not found", err); }); }
额外优化提示
原代码中then(singleData => { return singleData; })属于冗余代码,因为find().next()本身返回Promise,直接return即可,无需额外包裹。另外建议在catch中抛出错误,让调用方能够感知并处理异常,而不是仅打印日志。
内容的提问来源于stack exchange,提问作者Soumi Ghosh
相关产品推荐
相关产品推荐

