NestJs 猫鼬嵌套填充未按预期工作

时间:2021-04-28 18:40:43

标签: javascript typescript mongoose nosql nestjs

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

  1. 每个客户都有一组人员
  2. 每个人都有一个地址
  3. 每个客户也有一个地址 我想将客户与人员及其地址一起填充。它只返回人员数据,不返回地址数据。

我试过了:

 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),也不返回我尝试过的人下的地址。

1 个答案:

答案 0 :(得分:0)

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

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

应该是这样的:

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

当然在 Array 类型中也是如此。 我很抱歉上网。