我正在使用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不会自动为我生成它。
subPage._id = new Types.ObjectId();
如何让Typegoose自动生成子文档模型的对象ID ?
正如您在代码中看到的那样,我必须显式地为每个子页面生成对象id,因为Typegoose不会自动为我生成它。
@prop({ required: true, type: Types.ObjectId }) public _id!: Types.ObjectId;
如果您将@prop
添加到自动生成的属性中,则显式覆盖默认的_id
行为。解决方法是删除@prop
装饰行,除非您需要更改类型。
PS:我还更新了typegoose文档,以便在Change _id Type中更好地解释这种情况。
@prop({ required: false, type: Array }) public subPages?: SubPage[];
永远不要用通用的Array
类型声明你的数组类型,这将导致一个Mixed
数组,读数组类型&字段。
(目前你基本上是说属性是一个数组,但没有任何验证)