MongoDBでのMongooseを使ったComposite/Compound Keys - NestJSとDEVコミュニティ

Haad Baig

Haad Baig

2022年10月11日に投稿され、元の記事は2022年9月16日に Medium で公開されました。

       

MongoDBでMongooseを使ってComposite/Compound Keysを作る - NestJS

私は最近NestJSとMongoDBとmongooseを探求しています。新しいフレームワークなのでオンラインで助けを見つけるのがなかなか大変です。なので、私ができるだけの助けを提供し、皆さんの生活を楽にするためにここにいます。

免責事項: _GitHubリポジトリでは複数のデータベースを使ってましたが、例では単一データベースを使っているため、app.moduleファイル内のuserとhobbyモジュールでMongoose.Module.forFeature({})が見られます。だけど、これらのmongooseモジュールは一つのデータベース、つまり'db1'を使用しています。気にする必要はありません。単一データベースを使ってもコードは問題なく動作します。_

今日は、NestJSでmongooseを使ったcomposite/compound keysの作成について説明します。また、schemaファイルをさまざまなケースシナリオで変更する方法も示します。この例で使っている全コードベースを提供しますが、以下の点について理解を深めるのに役立ちます:

  1. NestJSアプリの簡単な作成方法。
  2. NestJSでmongooseを使ってschemaを作成する方法。
  3. NestJSでmoduleを作成する方法。
  4. 参照関係と埋め込み関係とは何か。
  5. NestJSでAPIを書く方法。

また、composite keysを作るためには、schemaファイルだけを変更する必要があるため、schemaファイルのコードのみを記載します。そして、repository、service、controllerファイルを使って、自分の欲しい通りに、そしてビジネスロジックに従ってAPIを書きます。

始めましょう。まずは、コマンドを使ってNestJSアプリケーションを作成します:

nest new application_name

これで、作業に使えるシンプルなボイラープレートコードが提供されます。これからmoduleを作成しますが、この例ではシンプルなUser moduleを使用します。コマンドは:

nest g module module_name

さて、schemaを作成しましょう。NestJSでは、アプリケーション全体にdecoratorを使用します。それらは見た目が怖いかもしれませんが、私たちの仕事をとても楽にしてくれます。私のuser-schemaのコードはこちらです:

export type UserDocument = User & Document;

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

  @Prop()
  age: number;

  // @Prop({type: Types.ObjectId, ref: () => Address, refPath: 'db2'})
  // address: Address[]

  @Prop()
  hobby: Hobby[]
}

export const UserSchema = SchemaFactory.createForClass(User);

UserSchema.index({email: 1, hobby: 1}, {unique: true})

ここで、私は他のschemaオブジェクトであるHobbyの組み込みオブジェクトを持つschemaを定義しています。NestJSでは、nodeと同じように、mongooseを使う場合、index関数内のエンティティ名を渡すことによって、schemaにcomposite keysを教える必要があります。名前の後ろの数字は単にソート順を示しています。最後の行でuniqueフラグを追加することで、このキーに一意制約を割り当てます。つまり、このキーの組み合わせが繰り返されるとデータベースエラーを通じることになります。

Array of embedded objectsを使ってComposite keyを作成するために、もう少し複雑にしました。異なるシナリオでcomposite keysを作成するために必要な変更点について言及します:

  1. 参照されたオブジェクト:

Prop()デコレータ内にTypes.ObjectIdとしてpropのタイプを追加し、引用文字列としてpropの参照スキーマを定義します。更新後の行は次のようになります。

@Prop({type: Types.ObjectId, ref: 'Hobby'})
hobby: Hobby[]

挿入前に、データベースはemailと配列内のObjectIDの組み合わせをチェックし、もし可能なペアが繰り返されるとエラーを通じます。

  1. 関係なし:

同じschemaのエンティティを使ってcomposite keysを作成するには、この場合はemailとageを使ってcomposite keyを作ります。変更する必要があるのは、UserSchema.index関数内の情報だけです。更新後の行は次のようになります:

UserSchema.index({email: 1, age: 1}, {unique: true})

挿入前に、データベースはemailとageの組み合わせをチェックし、ペアが繰り返されるとエラーを通じます。

当然のことですが、まだ言及する価値があると思います:

2つ以上のエンティティを組み合わせてcomposite keysを作ることができます。composite keyに含めたいエンティティをSchema.Index({ },{unique: true})関数でスキーマに教えるだけです。

この記事からのすべてです。開発者の皆さんに役立つことを願っています。

動作するコードベースへのリンクはこちらです:

GitHub - haadbaig/NestJS

Medium/Twitter/LinkedInで私に連絡してください。NestJSのどのトピックについても、記事を書いてほしい場合はお気軽にどうぞ。

こちらの記事はdev.toの良い記事を日本人向けに翻訳しています。
https://dev.to/haadbaig/compositecompound-keys-in-mongodb-using-mongoose-in-nestjs-5cnh