NestJs mongoose 嵌套填充未按预期工作

Posted

技术标签:

【中文标题】NestJs mongoose 嵌套填充未按预期工作【英文标题】:NestJs mongoose nested populate not working as expected 【发布时间】:2021-07-22 03:45:48 【问题描述】:

我尝试了所有可能的语法来弄清楚如何在 mongoose 中填充数据,但没有一个有效,这是我的示例:

    每个客户都有一组人员 每个人都有一个地址 每个客户也有一个地址 我想将客户连同人员及其地址一起填充。它只返回人员的数据,但不返回地址数据。

我试过了:

 this._customerModel
.findOne( _id: '60898b500870d6a664fc7403' )
.populate( path: 'persons', populate:  path: 'persons.address'  );

还有这个:

 this._customerModel
.findOne( _id: '60898b500870d6a664fc7403' )
.populate( path: 'persons' );

还有这个:

 this._customerModel
.findOne( _id: '60898b500870d6a664fc7403' )
.populate( path: 'persons', model : 'Person' )

还有这个:

 this._customerModel
.findOne( _id: '60898b500870d6a664fc7403' )
.populate('persons');

他们都返回这个:


  address: 60898b500870d6a664fc7404,
  persons: [],
  _id: 60898b500870d6a664fc7403,
  siren: 'string',
  companyName: 'string',
  legalForm: 'string',
  startDate: 'string',
  __v: 0

如您所见,它甚至不返回人员内部的 ID。如果我不填充任何内容,它会返回:


  address: 60898b500870d6a664fc7404,
  persons: [ 60898b500870d6a664fc7405, 60898b500870d6a664fc7408 ],
  _id: 60898b500870d6a664fc7403,
  siren: 'string',
  companyName: 'string',
  legalForm: 'string',
  startDate: 'string',
  __v: 0

如您所见,数据就在那里。 地址实际上是一样的。它不会被填充,它总是返回的 ObjectId。 我正在注入这样的模型:

  MongooseModule.forFeature(
            [
                
                    name: 'Customer',
                    schema: customerSchema,
                    collection: 'customers',
                ,
            ],
            'nosql',
        )

我查看了互联网。 NestJs 中没有 3 级嵌套 populate() 的示例 如果那里有,或者您可能知道解决方案,如果您告诉我,我将不胜感激,谢谢。

@Schema()
export class Customer extends mongoose.Document 
@Prop()
id: string;
@Prop( type: String )
companyName: string;
@Prop( type:  type: mongoose.Schema.Types.ObjectId, ref: 'Address'  )
address: Address;
@Prop( type: [ type: mongoose.Schema.Types.ObjectId, ref: 'Person' ] )
persons: Person[];


@Schema()
export class Person extends mongoose.Document 
@Prop()
id: string;
@Prop( type: String )
firstName: string;
@Prop( type:  type: mongoose.Schema.Types.ObjectId, ref: 'Customer'  )
customer: Customer;
@Prop( type:  type: mongoose.Schema.Types.ObjectId, ref: 'Address'  )
address: Address;



@Schema()
export class Address extends mongoose.Document 
@Prop()
id: string;
@Prop( type: String )
address1: string;

更新: 这个

this._customerModel
            .findOne( _id: '60898b500870d6a664fc7403' )
            .populate('address')
            .populate('persons')

返回这个:


  address: 60898b500870d6a664fc7404,
  persons: [
    
      customer: 60898b500870d6a664fc7403,
      _id: 60898b500870d6a664fc7405,
      firstName: 'string',
      __v: 0
    ,
    
      address: 60898b500870d6a664fc7406,
      customer: 60898b500870d6a664fc7403,
      _id: 60898b500870d6a664fc7408,
      firstName: 'string',
      __v: 0
    
  ],
  _id: 60898b500870d6a664fc7403,
  companyName: 'string',

仍然没有返回地址(1 级),也没有返回我尝试过的人下的地址。

【问题讨论】:

你试过把 .populate('addresses') 我知道名字是复数的 this._customerModel .findOne( _id: '60898b500870d6a664fc7403' ) .populate('address') .populate('persons') 在这里,而不是 .populate('address'),试试.populate('地址') 是的,很抱歉,我想我在完全加载之前发现了你的评论,哈哈,是的,我试过了,它返回的响应与上次更新相同,就像这样 :.findOne( _id: ' 60898b500870d6a664fc7403' ) .populate('address') .populate('persons') 【参考方案1】:

我在尝试制作一个 git 示例后发现它,这就是问题所在:

@Prop( type:  type: mongoose.Schema.Types.ObjectId, ref: 'Address'  )

应该是这样的:

@Prop( type: mongoose.Schema.Types.ObjectId, ref: 'Address' )

当然在Array类型中也是。 对不起,互联网。

【讨论】:

以上是关于NestJs mongoose 嵌套填充未按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

NestJS - 使用 mongoose 使用枚举嵌入嵌套文档

NestJS + Mongoose + GraphQL:“填充”不起作用

如何在nestjs mongoose typescript中引用嵌套文档

Mongoose pre.save() 异步中间件未按预期工作

Mongoose pre.save() 异步中间件未按预期工作

如何使用来自@nestjs/mongoose 的@Prop 装饰器添加嵌套的对象数组