You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 16:57:30