gpt4 book ai didi

node.js - Nestjs: Mongoose 中子文档数组的正确模式(没有默认 _id 或重新定义 ObjectId)

转载 作者:行者123 更新时间:2023-12-05 02:43:05 25 4
gpt4 key购买 nike

我正在使用 Nest.js 并尝试使用包含子文档字段数组的装饰器创建架构。

导入/导出架构并将其转换为模型时,我没有任何问题,直到:

Error

我在我的 service 文件中收到以下错误。

经过几个小时的谷歌搜索,我发现真正的原因在 array 子文档字段后面,而且只有它们。 一旦我删除了 members 字段。模式和模型会很好。 并且不必对描述的解决方案做任何事情 in following , 或 any other answersextends Mongoose.Document 相关。 (如果你已经这样做了)

我发现的大多数情况都与子文档相关,但与数组子文档无关。我想问:

如何使用装饰器通过 mongoose/Typescript 在 Nestjs 中正确创建包含子文档数组的字段?

并去除这个错误:

S2344: Type 'Guild' does not satisfy the constraint 'Document<any, {}>'.   
The types returned by 'delete(...).$where(...).cast(...)' are incompatible between these types.
Type 'UpdateQuery<Guild>' is not assignable to type 'UpdateQuery<Document<any, {}>>'.
Type 'UpdateQuery<Guild>' is not assignable to type '_UpdateQuery<_AllowStringsForIds<LeanDocument<Document<any, {}>>>>'.
Types of property '$pull' are incompatible.
Type 'PullOperator<_AllowStringsForIds<LeanDocument<Guild>>>' has no properties in common with type 'PullOperator<_AllowStringsForIds<LeanDocument<Document<any, {}>>>>'.

我的架构是:

import { Document, Schema as MongooseSchema } from 'mongoose';
import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose';

class GuildMember {
@Prop({ type: String, required: true, lowercase: true })
_id: string;

@Prop({ required: true })
id: number;

@Prop({ required: true })
rank: number;
}

@Schema({ timestamps: true })
export class Guild extends Document {
@Prop({ type: String, required: true, lowercase: true })
_id: string;

@Prop({ type: MongooseSchema.Types.Array})
members: GuildMember[]
}

export const GuildsSchema = SchemaFactory.createForClass(Guild);

我做了什么

各种方式包括:

  • @Schema()装饰器覆盖子文档Class并添加extends Document
  • 添加 type: 到字段 @Prop() 装饰器:
  @Prop({ type: [GuildMember] })
members: GuildMember[]

反之亦然。对于基元,它是 ok,但对于 Class 嵌入式文档则不然。

  • 添加 @Prop({ ref: () => GuildMember })

并遵循官方 NestJs 文档:

  @Prop({ type: [{ type: MongooseSchema.Types.Array, ref: GuildMember }] })
members: GuildMember[]

还是没用。我想,它可能不仅与 mongoose.Document 相关,而且与另一种类型相关,即:mongoose.DocumentArray

更新:

按照目前的进度。似乎问题与默认 Mongoose 的 field: type 值有关,而不是 @Prop 装饰器本身。所以即使我写这样的东西:

  @Prop()
members: Types.Array<GuildMember>

还是报错。类型导入自:import { Document, Schema as MongooseSchema, Types } from 'mongoose';

最佳答案

更新:

工作解决方案:

为其他 TS 原语重新定义了 _id:

import { Document, Schema as MongooseSchema, Types } from "mongoose";
import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose';

@Schema()
class Pet extends Document {
@Prop({ type: Number })
_id: number;

@Prop({ type: String })
name: string;
}

export const PetsSchema = SchemaFactory.createForClass(Pet);

对象字段的父架构数组:

  @Prop({ type: [PetsSchema] })
pets: Types.Array<Pet>;

如果您想完全禁用内置 ObjectId

使用以下 @Prop 装饰器并从子模式中删除 _id:

  @Prop({ _id: false, type: [PetsSchema] })
pets: Types.Array<Pet>;

关于node.js - Nestjs: Mongoose 中子文档数组的正确模式(没有默认 _id 或重新定义 ObjectId),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67044809/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com