Mongodb子文档没有自动生成对象id Typegoose/ mongoose



我正在使用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数组,读数组类型&字段。
(目前你基本上是说属性是一个数组,但没有任何验证)

相关内容

  • 没有找到相关文章

最新更新