概要
Mongoose には ref
という機能がありまして、他のコレクションのドキュメントへの参照 ID を持つことができます。 ref
は populate
を使って解決します。
この記事では、ネストされた ref
を解決する方法について書きます。
サンプル
例えば、以下のようなスキーマがあったとします。コード例は 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
が解決されています。