Mongodb 转换为ObjectId的值“失败”;ULID“u ID”;在路径上“;docA“;

Mongodb 转换为ObjectId的值“失败”;ULID“u ID”;在路径上“;docA“;,mongodb,mongoose,Mongodb,Mongoose,我想让ULID和猫鼬一起工作 我的DocTypeA架构如下所示: const mongoose=require('mongoose')) const Schema=mongoose.Schema const ULID=require('ULID') 常量模式=新模式({ _id:{type:Schema.Types.String,默认值:()=>ULID.ULID(Date.now())}, 名称:{type:Schema.Types.String}, }) schema.set('toJSON

我想让ULID和猫鼬一起工作

我的DocTypeA架构如下所示:

const mongoose=require('mongoose'))
const Schema=mongoose.Schema
const ULID=require('ULID')
常量模式=新模式({
_id:{type:Schema.Types.String,默认值:()=>ULID.ULID(Date.now())},
名称:{type:Schema.Types.String},
})
schema.set('toJSON'{
虚拟人:是的,
versionKey:false,
转换:功能(文档、ret){
//在序列化对象时移除这些道具
删除检索id
},
})
module.exports=mongoose.model('DocTypeA',schema)
我的DocTypeB架构如下所示:

const mongoose=require('mongoose'))
const Schema=mongoose.Schema
const ULID=require('ULID')
常量模式=新模式({
_id:{type:Schema.Types.String,默认值:()=>ULID.ULID(Date.now())},
名称:{type:Schema.Types.String},
docA:{type:Schema.Types.ObjectId,ref:'DocTypeA'},
})
schema.set('toJSON'{
虚拟人:是的,
versionKey:false,
转换:功能(文档、ret){
//在序列化对象时移除这些道具
删除检索id
},
})
module.exports=mongoose.model('DocTypeB',schema)
我能够为
DocTypeA
创建文档,ULID生成的内容将保存为
DocTypeA
文档中的_id。 但是当我试图在创建
DocTypeB
文档时引用
DocTypeA
文档id时,我得到了强制转换错误(在标题中提到)

以下是创建
DocTypeA
的代码:

const create=async(有效负载)=>{
const docA=新DocTypeA(有效负载)
等待docA.save()
返回docA
}
为了创建
DocTypeB
,我使用了:

const create=async(有效负载)=>{
const docB=新DocTypeB(有效负载)
等待文档保存()
退货单据
}
ULID不合格。 它们不是十六进制字符串,是26个字符长度的标识符

根据
DocTypeB
的模式声明方式,
docA
字段应为
String
类型,而不是
ObjectId

DocTypeB
的模式定义应如下所示

const schema=新架构({
_id:{type:Schema.Types.String,默认值:()=>ULID.ULID(Date.now())},
名称:{type:Schema.Types.String},
docA:{type:Schema.Types.String,ref:'DocTypeA'},
});
否则,Mongoose将尝试将标识符转换为
ObjectId
,这将抛出

异步函数create(){ const docA=new DocTypeA({name:'Jack'}) 等待docA.save() const docB=新的DocTypeB( {name:'Jill',docA}//或{name:'Jill',docA:docA.\u id}) ) 等待docB.save(); } create().then(console.log('done')).catch(console.error)
请注意,在集合中会自动添加唯一索引,因此您必须小心,不要在不同文档中为其设置相同的值。

为什么在
doctypeb
Schema中使用
docA:{type:Schema.Types.ObjectId,ref:'DocTypeA'}
?我认为您必须使用
docA:{type:Schema.Types.String,ref:'DocTypeA'}
String ref有效吗?所以mongoose只是使用ref来确定要查找哪个集合,并检查_id的类型是否与引用中提到的相同?我遇到了问题。您能否添加我应该做的必要更改,以便我可以使用ULID和mongoose填充?mongoose是否使用type:string和ref属性?或者我应该像在@Akshay中那样使用virtuals进行设置填充吗?您应该能够为_id字段使用任何支持的类型。您只需注意,在集合中的文档中为其设置的值是唯一的。