【问题标题】:mongoose Populate does not work on field having array of ObjectIds猫鼬填充不适用于具有 ObjectIds 数组的字段
【发布时间】:2021-03-12 12:44:54
【问题描述】:

在第一个 shema 是 @Prop({ type: { Types.ObjectId, ref: Tag.name }}) 更改为 @Prop({ type: [{ type: Types.ObjectId, ref: Tag.name }]}) 后,我没有从数据库中收到数据,因为这里推荐 https://github.com/nestjs/nest/issues/5716 我收到错误架构尚未注册模型 环境:

node-version: v14.15.1
Ubuntu: 18.04.5 LTS
"@nestjs/core": "7.5.5",
"mongoose": "^5.10.9",
"@nestjs/mongoose": "^7.1.2",`

conversatiom.schema.ts

import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose';
import { Document, Types } from 'mongoose';
import { CONVERSATION_STATUS } from './conversation-status.constant';
import { Tag } from '../tag/tag.schema';

export type ConversationDocument = Conversation & Document;

@Schema()
export class Conversation {
  @Prop({ required: true })
  _id: Types.ObjectId;

  @Prop({ required: true })
  workspace: Types.ObjectId;

  @Prop()
  assignee?: string;

  @Prop({ default: false })
  priority?: boolean;

  @Prop({
    default: CONVERSATION_STATUS.OPEN,
    enum: [CONVERSATION_STATUS.OPEN, CONVERSATION_STATUS.CLOSED, CONVERSATION_STATUS.REOPENED]
  })
  status?: CONVERSATION_STATUS;

  @Prop({ type: [{ type: Types.ObjectId, ref: Tag.name }]})
  tags?: Tag[] | Types.ObjectId[];

  @Prop({ required: true })
  createdBy: string;

  @Prop({ default: new Date() })
  createdAt?: Date;

  @Prop()
  updatedBy?: string;

  @Prop()
  updatedAt?: Date;
}

export const ConversationSchema = SchemaFactory.createForClass(Conversation);

tag.schema.ts

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

export type TagDocument = Tag & Document;

@Schema()
export class Tag {
  @Prop({ required: true })
  value: string;

  @Prop({ required: true })
  createdBy: string;

  @Prop({ default: new Date() })
  createdAt?: Date;
}

export const TagSchema = SchemaFactory.createForClass(Tag);

tag.module.ts

import { Module } from '@nestjs/common';
import { MongooseModule } from '@nestjs/mongoose';
import { TagController } from './tag.controller';
import { TagService } from './tag.service';
import { ConversationSchema } from '../conversation/conversation.schema';
import { TagSchema } from './tag.schema';

@Module({
  imports: [
    MongooseModule.forFeature([{ name: 'tag', schema: TagSchema }]),
    MongooseModule.forFeature([{ name: 'conversation', schema: ConversationSchema }])
  ],
  controllers: [TagController],
  providers: [TagService]
})
export class TagModule {}

错误:

stdout: [Nest] 152   - 11/30/2020, 1:26:46 PM   [RpcExceptionsHandler] Schema hasn't been registered for model "Tag".
Use mongoose.model(name, schema) +7158ms

stdout: MissingSchemaError: Schema hasn't been registered for model "Tag".
Use mongoose.model(name, schema)
    at NativeConnection.Connection.model (/app/node_modules/mongoose/lib/connection.js:1195:11)
    at getModelsMapForPopulate (/app/node_modules/mongoose/lib/helpers/populate/getModelsMapForPopulate.js:285:59)
    at populate (/app/node_modules/mongoose/lib/model.js:4321:21)
    at _populate (/app/node_modules/mongoose/lib/model.js:4291:5)
    at /app/node_modules/mongoose/lib/model.js:4267:5
    at promiseOrCallback (/app/node_modules/mongoose/lib/helpers/promiseOrCallback.js:9:12)
    at Function.Model.populate (/app/node_modules/mongoose/lib/model.js:4265:10)
    at cb (/app/node_modules/mongoose/lib/query.js:1946:17)
    at /app/node_modules/mongodb/lib/utils.js:674:5
    at handleCallback (/app/node_modules/mongodb/lib/utils.js:102:55)
    at /app/node_modules/mongodb/lib/cursor.js:838:66
    at /app/node_modules/mongodb/lib/utils.js:674:5
    at /app/node_modules/mongodb/lib/cursor.js:923:9
    at Cursor._endSession (/app/node_modules/mongodb/lib/core/cursor.js:394:7)
    at /app/node_modules/mongodb/lib/cursor.js:921:12
    at maybePromise (/app/node_modules/mongodb/lib/utils.js:662:3)

【问题讨论】:

  • 你能和我们分享一下标签模块吗?
  • 更新:添加标签模块

标签: mongoose nestjs


【解决方案1】:

我认为问题出在模块名称上:您可以像在对话类中那样使用类的属性名称:

  imports: [
    MongooseModule.forFeature([{ name: Tag.name, schema: TagSchema }]),
        MongooseModule.forFeature([{ name: Conversation.name, schema: ConversationSchema }])
      ],

Ps:MongooseModule.forFeature 接受一个数组,你用这种方式注册所有的模式:

 MongooseModule.forFeature([{ name: Tag.name, schema: TagSchema },{ name: Conversation.name, schema: ConversationSchema }])

【讨论】:

    猜你喜欢
    • 2021-11-08
    • 1970-01-01
    • 2015-07-13
    • 2021-05-06
    • 2014-04-19
    • 1970-01-01
    • 2014-01-08
    • 2015-07-13
    • 2016-10-10
    相关资源
    最近更新 更多