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