MongoDBでのMongooseを使ったComposite/Compound Keys - NestJSとDEVコミュニティ
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ファイルをさまざまなケースシナリオで変更する方法も示します。この例で使っている全コードベースを提供しますが、以下の点について理解を深めるのに役立ちます:
- NestJSアプリの簡単な作成方法。
- NestJSでmongooseを使ってschemaを作成する方法。
- NestJSでmoduleを作成する方法。
- 参照関係と埋め込み関係とは何か。
- 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を作成するために必要な変更点について言及します:
- 参照されたオブジェクト:
Prop()デコレータ内にTypes.ObjectIdとしてpropのタイプを追加し、引用文字列としてpropの参照スキーマを定義します。更新後の行は次のようになります。
@Prop({type: Types.ObjectId, ref: 'Hobby'})
hobby: Hobby[]
挿入前に、データベースはemailと配列内のObjectIDの組み合わせをチェックし、もし可能なペアが繰り返されるとエラーを通じます。
- 関係なし:
同じ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})関数でスキーマに教えるだけです。
この記事からのすべてです。開発者の皆さんに役立つことを願っています。
動作するコードベースへのリンクはこちらです:
Medium/Twitter/LinkedInで私に連絡してください。NestJSのどのトピックについても、記事を書いてほしい場合はお気軽にどうぞ。
こちらの記事はdev.toの良い記事を日本人向けに翻訳しています。
https://dev.to/haadbaig/compositecompound-keys-in-mongodb-using-mongoose-in-nestjs-5cnh