MongoDBリファレンスの簡単な始め方 | Mongoose、Nest.js + 例
非関係型ドキュメントデータベースでのリファレンス実装方法は以下のとおりです:
- 手動
- リファレンスを使用
手動実装の例:
ユーザーコレクションのモデルとスキーマ:
user.model.ts
import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose';
import { HydratedDocument } from 'mongoose';
import { BaseModel } from '../base/base.model';
import { Types } from 'mongoose';
export type UserDocument = HydratedDocument<UserModel>;
@Schema()
export class UserModel extends BaseModel {
@Prop()
username: string;
@Prop()
description: string;
@Prop()
password: string;
_id: Types.ObjectId
}
export const UserSchema = SchemaFactory.createForClass(UserModel);
Userの_idは手動で他のコレクションドキュメント(例えばPos)に保存され、この_idを使ってユーザーコレクションから現在のユーザーを追加のクエリで検索することができます。
しかし、追加のクエリは避けて、データの保存と取得にリファレンスを使用しましょう。
こちらは投稿モデルです:
post.model.ts
import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose';
import { HydratedDocument } from 'mongoose';
import { BaseModel } from '../base/base.model';
import { Types } from 'mongoose';
export type PostDocument = HydratedDocument<PostModel>;
@Schema()
export class PostModel extends BaseModel {
@Prop()
name: string;
@Prop()
description: string;
@Prop({ type: Types.ObjectId, ref: 'UserModel' })
authorId: { type: Types.ObjectId; ref: 'UserModel' };
_id: Types.ObjectId;
}
export const PostSchema = SchemaFactory.createForClass(PostModel);
リファレンスのためのプロパティにマークをつけ、リファレンスのためのモデルを設定します。
この時点でリファレンスは保存されていますので、データを取得しましょう!
MongooseはMongoDBの$lookupのための代替方法としてpopulateメソッドを提供しています。
このメソッドに引数を渡しましょう(参照フィールドと新しいオブジェクトの選択されたフィールド)
サービス関数:
async findOneAndPopulate(id: string, fieldName: string, chosenFields: Record<string, number>) {
return await this.baseModel
.findById(id)
.populate({ path: fieldName, select: chosenFields })
.exec();
}
コントローラー関数:
@Get(':id')
findOne(@Param('id') id: string) {
return this.postService.findOneAndPopulate(id, 'authorId', {
username: 1,
});
}
レスポンス結果
リファレンスとpopulateを使用する前:
{
"_id": "6513ef6da50adaaa3d811721",
"name": "00000000000000000000000000",
"description": "tuyityityutyututuuutyutyutyutyutyuytutyutyuytutyutyutyutyutyutyutyutyutyuytutyutyutyutyu",
"authorId": "65082a6acd765074d09f38b0",
"__v": 0
}
使用した後:
{
"_id": "6513ef6da50adaaa3d811721",
"name": "00000000000000000000000000",
"description": "tuyityityutyututuuutyutyutyutyutyuytutyutyuytutyutyutyutyutyutyutyutyutyuytutyutyutyutyu",
"authorId": {
"_id": "65082a6acd765074d09f38b0",
"username": "juliechernen@gmail.com"
},
"__v": 0
}
MongoDBとMongooseでのリファレンスの使用方法に関する他のコメントも歓迎します。
こちらの記事はdev.toの良い記事を日本人向けに翻訳しています。
https://dev.to/juliecherner/quick-start-with-mongodb-references-mongoose-nestjs-examples-15c0