我正在使用TypeScript,Node JS和MongoDB构建一个Web应用程序。我使用Typegoose,https://www.npmjs.com/package/@typegoose/typegoose与MongoDB交互。现在,我试图让Typegoose/ mongoose自动生成子文档模型的对象ID。你可以看到下面的虚拟代码。
我有以下型号
import { Types } from 'mongoose';
import { getModelForClass, prop } from '@typegoose/typegoose';
class PageContract {
@prop({ required: true, type: String })
public title!: string;
@prop({ required: false, type: String })
public description?: string;
@prop({ required: false, type: String })
public externalLink?: string;
@prop({ required: true, type: Date, default: Date.now() })
public createdAt!: Date;
}
export class SubPage extends PageContract {
@prop({ required: true, type: Types.ObjectId })
public _id!: Types.ObjectId;
}
export class Page extends PageContract {
@prop({ required: false, type: Array })
public subPages?: SubPage[];
@prop({ required: false, type: Date })
public publishedAt!: Date;
@prop({ required: false, type: Date })
public draftedAt!: Date;
@prop({ required: false, type: Date })
public unpublishedAt!: Date;
}
export const PageModel = getModelForClass(Page);
export const SubPageModel = getModelForClass(SubPage);
正如你在上面的代码片段中看到的,Page
有很多SubPage
模型。我正在创建一个页面,下面是子页面。
export const createPage = ({
title,
description,
externalLink,
subPages,
status
}: SavePagePayload): Promise<DocumentType<Page>> => {
const docSubPages: SubPage[] = [];
if (subPages && subPages.length > 0) {
subPages.every(({ title, description, externalLink }) => {
const subPage = new SubPage();
subPage._id = new Types.ObjectId();
subPage.title = title;
subPage.description = description;
subPage.externalLink = externalLink;
docSubPages.push(subPage);
});
}
const statusFields = getNextStatusTimestamps(status);
return PageModel.create({
...statusFields,
title,
description,
externalLink,
subPages: docSubPages
});
};
正如您在代码中所看到的,我必须显式地为每个子页面生成对象ID,如下所示,因为Typegoose不会自动为我生成对象ID。
subPage._id = new Types.ObjectId();
如何让Typegoose自动生成子文档模型的对象ID?
1条答案
按热度按时间628mspwn1#
正如您在代码中所看到的,我必须显式地为每个子页面生成对象ID,如下所示,因为Typegoose不会自动为我生成对象ID。
如果您将
@prop
添加到自动生成的属性中,则会显式覆盖默认的_id
行为。修复方法是删除@prop
装饰器行,除非您需要更改类型。PS:我还更新了typegoose文档,以更好地解释Change _id Type中的这种情况。
永远不要用泛型
Array
类型声明数组类型,这将导致Mixed
数组,读作Array Types & Fields。(目前你基本上是说属性是一个数组,但没有任何验证)