Mongodb 转换为ObjectId的值“失败”;ULID“u ID”;在路径上“;docA“;
我想让ULID和猫鼬一起工作 我的DocTypeA架构如下所示: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
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字段使用任何支持的类型。您只需注意,在集合中的文档中为其设置的值是唯一的。