mongoose.Schema の type: ObjectId について解説

mongoose.Schema の type: ObjectId について解説する機会があったので、その内容をご紹介します。

mongoose | マングース

質問 mongoose.Schema type: ObjectId って?

Q) mongoose.Schema の赤線の type プロパティの値が理解できてません…
他のオブジェクトは String や Number が値になっているのに、user の type プロパティにはユニークID?が入ってるのがちょっとよくわからないです。

mongoose.Schema.Types.ObjectId example

A) ざっくり先に回答しておくと ObjectId は MongoDB document の id でして、この場合だと ProfileScheme の関連先 ref の user._id (ObjectId) を保存する field という定義になります。

以下、順序立てて説明していきます。

MongoDB _id について

ProfileScheme.user に保存する ObjectId は user document の _id で、主キーと呼ばれるものです。_id には ObjectId が保存されます。

ObjectId の生成規則については、以下の記事をご覧ください。

mongodbのObjectIdの生成規則 – としたにあんの左脳

主キーって?

「主キーって何?」という点はこちらをご一読ください。

主キー (primary key)とは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

MongoDB _id が保存される仕組みについて

あなたが挿入したデータに _id フィールドが追加されていることに注目して下さい。全てのドキュメントはユニークな _id フィールドを持たなくてはいけません。これは ObjectID 型の値を自分で生成するか MongoDB に生成させる事になります。ほとんどの 場合 MongoDB に生成させたいと思うでしょう。

引用元: MongoDBの薄い本

Mongoose ref

ref はリレーションの定義

Mongoose ref は DB のリレーションを定義するものでして、以下の記事がわかりやすいと思います。

RDB脳でもできた、mongooseを使ってmongodbでリレーションとjoinっぽいこと | I am mitsuruog

ref のメリット

ref は MongoDB collection 間のリレーションを表現する以外に、find 時にリレーション先のドキュメントも一緒に取得できる という点がメリットだと思ってます。

以下の記事に、サンプルコードと実行結果が載ってるので、あわせて確認してもらうとイメージしやすいと思います。

mongooseでリレーション – Qiita

以上、MongoDB _id, ObjectId と Mongoose ref についてざっくり解説した、現場からお送りしました。