Typegoose / Mongoose 将自定义类型映射到 db

Posted

技术标签:

【中文标题】Typegoose / Mongoose 将自定义类型映射到 db【英文标题】:Typegoose / Mongoose map custom type to db 【发布时间】:2021-11-20 16:33:35 【问题描述】:

我的设置

打字稿 猫鼬 Typegoose

我有一个班级时间码

export class Timecode 
  constructor(private timestamp: string) 

  getAsMilliseconds(): number 
    throw new Error('Not implemented');
  

  add(timecode: Timecode): Timecode 
    throw new Error('Not implemented');
  

  toString(): string 
    return this.timestamp;
  


还有一个实体剪辑

import  prop  from '@typegoose/typegoose';
export class Clip extends BaseEntity 
  @prop( required: true )
  name: string;

  @prop( required: true )
  description: string;

  @prop(
    required: true,
    type: Timecode,
  )
  startTimecode: Timecode;

我的问题

只需保存时间戳即可将时间码轻松序列化为字符串,例如00:00:12:34

我希望能够在我的实体上拥有Timecode 属性,然后当我保存到 mongo 时让它们自动序列化为字符串。此外,它们应该在加载时转换回 Timecode 实例。

这是一个例子

const clip = new Clip();
clip.name = "My Clip"
clip.description = "My Dessciption"
clip.startTimecode = new Timecode("00:00:12:34")  
const savedClip = await ClipModel.create(clip)
const loadedClip = await ClipModel.findById(savedClip._id)
console.log(loadedClip.startTimecode.getAsMilliseconds()) //should work as startTimecode is an instance of Timecode

所以我希望猫鼬在我保存具有Typecode 类型属性的实体并将其转换为字符串然后在加载时将其反转为Typecode 的实例时注意到。

理想情况下,我可以在一个地方配置它,而不是在我声明Typecode 属性的每个地方。

这可能吗?我该怎么做?

谢谢

【问题讨论】:

【参考方案1】:

最简单的方法是使用 getset 选项将属性从 / 转换为 Timecode 并将其作为字符串保存在数据库中,但是使用多个属性可能会变得乏味且难以调试.

Mongoose 还支持Custom Schema Types,Typegoose 要求这些类型有一些属性(默认情况下应该有),列在Custom Types 中。

一个小例子可以在typegoose's tests找到。

【讨论】:

以上是关于Typegoose / Mongoose 将自定义类型映射到 db的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose / typegoose 根据开始和结束索引获取数组

如何提取 typescript mongoose/typegoose 模式

使用多个装饰器将 Type-GraphQL 与 Typegoose 相结合

Typescript typegoose getModelForClass 返回类型

GraphQLError:类型查询必须定义一个或多个字段。使用类型鹅

如何将自定义 ObjectId 添加到解析服务器对象?