如何在 NestJS (MongoDB) 中设置唯一复合索引

Pet*_*cht 7 unique mongoose mongodb nestjs

嘿,我有一个具有唯一电子邮件的用户架构:

@Schema()
export class User {
    @Prop()
    firstName!: string;

    @Prop()
    lastName!: string;

    @Prop({
        unique: true,
    })
    email!: string;

    @Prop({ nullable: true })
    password?: string;
}
Run Code Online (Sandbox Code Playgroud)

但现在我想扩展这个。我想要拥有自己的用户的群组。我将创建一个组集合并将其 id 添加到用户中,例如:

@Schema()
export class User {
    @Prop()
    groupId: string;

    @Prop()
    firstName!: string;

    ...
}
Run Code Online (Sandbox Code Playgroud)

对于每个组,电子邮件应该是唯一的。这意味着在用户集合中可能存在重复的电子邮件,但它们对于组来说应该是唯一的,我猜这被称为“唯一复合索引”

我如何在 NestJS 中进行设置?

gre*_*ort 19

看起来不可能仅通过使用装饰器来实现它@nestjs/mongoose,但是可以通过使用来声明索引SchemaFactory

@Schema()
export class User {
    @Prop()
    groupId: string;

    @Prop()
    firstName!: string;

    ...
}

export const UserSchema = SchemaFactory.createForClass(User);

UserSchema.index({ groupId: 1, firstName: 1 }, { unique: true });

Run Code Online (Sandbox Code Playgroud)

然后您必须执行创建迁移来创建此索引或启用自动索引功能

@Schema({
  autoIndex: true, // <--
})
export class User {
    @Prop()
    groupId: string;

    @Prop()
    firstName!: string;

    ...
}
Run Code Online (Sandbox Code Playgroud)