无法让猫鼬虚拟填充并在 NestJS 应用程序中运行

问题描述 投票:0回答:2

我目前正在开发一个项目,其中虚拟填充是非常必要的:

有一个客户方案、一个文档方案以及一些其他参考客户的方案。在客户内部,我想填充引用的项目。

我已经有了一个使用 Typegoose 的工作模型,由于后期的不兼容性,我不得不从项目中删除它。这就是它的工作方式之前

  @prop({ 
    ref: () => DMSDocument,
    foreignField: 'linkedCustomers', // compare this value to the local document populate is called on
    localField: '_id', // compare this to the foreign document's value defined in "foreignField",
    justOne: false
  })
  public documents: { type: Types.ObjectId, ref: 'DMSDocument' }[];

现在我试图仅在删除 typegoose 之后使用 nestjs/mongoose 来实现此目的:

@Prop({ 
    virtual: 'documents',
    ref: 'DMSDocument',
    foreignField: 'linkedCustomers',
    localField: '_id',
  })
  public documents: DMSDocument[];

虚拟吸气剂工作得很好,因为我只是在使用

@Schema({ toJSON: { virtuals: true, getters: true }, toObject: { virtuals: true, getters: true }})

模型的填充如下:

this.customerModel.findOne(params)
.populate('documents', '', 'DMSDocument')
.populate('repairs', '', 'Repair')

我不知何故陷入困境 - 我只是得到空数组,没有错误。我缺少什么?他们甚至可以使用 Nestjs/mongoose 吗?

mongoose nestjs mongoose-populate
2个回答
3
投票

好吧,我设法让事情再次正常运行,但不是以首选方式:

定义类并将其转换为模式之后

export const CustomerSchema = SchemaFactory.createForClass(Customer);

我只需“手动”添加虚拟填充:

CustomerSchema.virtual('documents', {
  ref: 'DMSDocument',
  localField: '_id',
  foreignField: 'links.customers',
  justOne: false
}); 

一切都按预期工作,但我更喜欢使用装饰器的方式。


0
投票

2024年的答案

您现在可以通过执行以下操作在 Nest.js 中实现此目的(我的版本是:10.0.0):

在您的客户模块中:

imports: [
    MongooseModule.forFeatureAsync([{
      name: Customer.name,
      useFactory: () => {
        const schema = CustomerSchema;
        schema.virtual('documents', {
            ref: 'DMSDocument',
            localField: '_id',
            foreignField: 'links.customers',
            justOne: false
        });
        return schema;
      }
    }])
 ],

这是文档的链接: https://docs.nestjs.com/techniques/mongodb#hooks-middleware

© www.soinside.com 2019 - 2024. All rights reserved.