コンパイラかく語りき

import { Fun } from 'programming'

【Mongoose】ネストされた ref を populate する

概要

Mongoose には ref という機能がありまして、他のコレクションのドキュメントへの参照 ID を持つことができます。 refpopulate を使って解決します。

この記事では、ネストされた ref を解決する方法について書きます。

参考: Populate - mongoosejs.com

サンプル

例えば、以下のようなスキーマがあったとします。コード例は JS で書いています。

import mongoose from '../libs/mongoose'
const { Schema } = mongoose

// グループ
const GroupSchema new Schema({
    id: Number,
    users: [{ type: Schema.Types.ObjectId, ref: 'User' }],
})
const Group = mongoose.model('Group', GroupSchema)

// ユーザー
const UserSchema = new Schema({
    id: String,
    books: [{ type: Schema.Types.ObjectId, ref: 'Book' }],
})
const User = mongoose.model('User', UserSchema)

// ブック
const BookSchema = new Schema({
    id: Number,
    text: String,
})
const Book = mongoose.model('Book', BookSchema)

グループ、ユーザー、ブック、というコレクションを作成しました。グループには複数のユーザーが含まれ、ユーザーは複数のブックを持つとします。

実際のデータ例が以下のとおり。

// groups
{
  id: 1,
  users: ['a', 'b']
}

// users
{
  id: 'a',
  books: [10]
}
{
  id: 'b'.
  books: [10, 20]
}

// books
{
  id: 10.
  text: '1000'
}
{
  id: 20.
  text: '2000'
}

ネストされた ref を populate

ここで、グループを find します。この時、ネストされたユーザーもブックも populate して ref の解決をします。実装は以下のとおりです。

Group.find({ id: 1 }).populate({ path: 'users', populate: { path: 'books' } })

取得されたデータは以下のとおり。

{
  id: 1.
  users: [
    {
      id: 'a',
      books: [
        {
          id: 10.
          text: '1000'
        }
      ]
    },
    {
      id: 'b',
      books: [
        {
          id: 10.
          text: '1000'
        },
        {
          id: 20.
          text: '2000'
        }
      ]
    }
  ]
}

ネストされた ref が解決されています。

参考: Populating Multiple Paths - mongoosejs.com