Mongodb子文档未自动生成对象ID Typegoes/ mongoose

hgc7kmma  于 2023-04-12  发布在  Go
关注(0)|答案(1)|浏览(203)

我正在使用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?

628mspwn

628mspwn1#

正如您在代码中所看到的,我必须显式地为每个子页面生成对象ID,如下所示,因为Typegoose不会自动为我生成对象ID。

@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数组,读作Array Types & Fields
(目前你基本上是说属性是一个数组,但没有任何验证)

相关问题