MongoDB Node.js insertOne报错string不可分配给ObjectId,如何将_id设为字符串?
问题原因
这个报错是TypeScript类型校验限制导致的,并非MongoDB数据库本身不支持字符串类型的_id。MongoDB本身允许任意JSON类型作为_id的值,你在MongoDB Shell可以正常插入字符串_id就是证明。默认情况下MongoDB Node.js驱动、Mongoose等库的类型定义会将_id的默认类型设为ObjectId,才会触发这个类型不匹配报错。
解决方法
分两种常用场景处理:
场景1:使用原生MongoDB Node.js驱动
在获取集合时传入自定义的文档泛型,显式指定_id为字符串类型即可:
// 1. 先定义你的文档类型,明确_id是string类型 interface User { _id: string; name: string; age: number; } async function foo() { // 2. 获取集合时传入定义好的泛型 const users = client.db("test").collection<User>("users") await users.insertOne({ _id: "a string", name: "Tom", age: 26, }) }
场景2:使用Mongoose
在定义Schema的时候显式指定_id字段的类型为String:
const userSchema = new mongoose.Schema({ // 明确指定_id类型为字符串 _id: { type: String }, name: String, age: Number }) const User = mongoose.model('User', userSchema) async function foo() { await User.create({ _id: "a string", name: "Tom", age: 26, }) }
临时绕过方案(不推荐)
如果只是临时调试不想修改类型定义,可以用类型断言跳过校验:
users.insertOne({ _id: "a string" as any, name: "Tom", age: 26, })
内容的提问来源于stack exchange,提问作者Yan
相关产品推荐
相关产品推荐

