我试图在Mongo中(通过websockets网关)使用以下模式创建对象:
export class Issue extends Document {
@Prop()
name: string;
@Prop()
description: string;
@Prop()
project: Types.ObjectId;
}
我的DTO也引用ObjectId类型:
import { Types } from 'mongoose';
export class CreateIssueDto {
readonly name: string;
readonly description: string;
readonly project: Types.ObjectId;
}
网关的@MessageBody()
装饰器似乎将所有内容都作为字符串拉入,因此,引用的project
作为字符串存储在mongo中。
将其强制转换为ObjectId
的正确方法是什么?仅仅是手动将消息解析为其组成部分并专门解析该字段吗?
答案 0 :(得分:0)
在有效负载中,您的项目prop是一个ID(十六进制格式)。您可以直接将其保存到数据库中。 如果要保存objectId,请再次获取项目对象,然后选择对象的ID作为objectId。
但是我认为id作为十六进制字符串就足够了。
答案 1 :(得分:0)
我也一直在努力解决这个问题,在尝试了百万次尝试之后,最终对我有用的是使用猫鼬的Types.ObjectId
中的Schema
,如下所示:
import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose';
import { Document, Schema as MongooseSchema, Types } from 'mongoose';
@Schema()
export class Issue extends Document {
@Prop()
name: string;
@Prop()
description: string;
@Prop({
type: MongooseSchema.Types.ObjectId,
ref: 'Project' // Your ref name, i've assumed it.
})
project: Types.ObjectId;
}
在您的DTO中执行相同的操作,请注意,我添加了一个别名,以免与@nestjs/mongoose
架构冲突。
编辑
经过一些研究,我发现Types.ObjectId
与Schema.Types.ObjectId
与mongoose
之间存在差异,其中第一个用于模型实例,后者用于定义架构字段,因此@Prop({type})必须来自MongooseSchema.Types.ObjectId
,并且属性的类型(在本例中为项目)必须使用Types.ObjectId
,这就是设置project
的方式正确地转换为ObjectId的字符串表示形式。