MongoDBの公式ドキュメントを読んで知ったことをここにメモしておこうと思います。
MongoDB:https://www.mongodb.com/docs/manual/introduction/
MongoDBの概要をざっくり理解する
- データはJSONのバイナリ表現であるBSON形式で格納されます。
- BSONとは:Binary JSONの略。JSONに似た文書のバイナリ符号化されたシリアライゼーション。
- シリアライゼーション:複数の並列データを直列化して送信すること。
- データは「コレクション」単位で管理されます。
参考サイト
ZDNET Japan:https://onl.sc/zsM4G7n
bsonspec.org:https://bsonspec.org/
基本の用語を理解する
Document
👻Document(ドキュメント)とは?
ややこしいのですが、「Document」には2つの意味があります。
- クラスとしてのDocument
- ModelのインスタンスとしてのDocument
(一般的にはこちらの意味で使われます。)
ドキュメントはJSONのような形をしています↓。
{ "name" : "hoge",
"data" : {
"birthday" : "2222/22/22",
"age" : "22"
}
}
正確にはJSONではなく、BSON形式で保存されます。
👻BSONとは?
「バイナリJSON」の略。JSONのバイナリ表現。
JSONよりも多くのデータ型が含まれています。
BSONのドキュメントサイズは最大16メガバイトです。
(1つのドキュメントが過剰にRAMや通信帯域を使用しないようにするために設定されています)
この記事ではわかりやすいように、
- クラスとしてのDocumentは「Document」
- ModelのインスタンスとしてのDocumentは「ドキュメント」
と表記することにします。
fieldとvalue
ドキュメントは”field(フィールド)”と”value(バリュー)”のペアで構成されています。
公式ドキュメントにある画像がとてもわかりやすいです
https://www.mongodb.com/docs/manual/introduction/#document-database
バリューはなんとなく想像できたとしても、
フィールドは想像しにくいと思います。
フィールドとは、RDBでいうところのカラムと同義です。
RDBではテーブルの中で全てのレコードが同じカラムを持っているのに対し、
MongoDBではドキュメントごとに自由なフィールドを定義できる点が大きな違いです。
(デフォルトではドキュメント内で重複したフィールドを持つことはできません)
引用元:https://www.mongodb.com/docs/manual/core/document/#embedded-documents
JavaScriptのオブジェクトとは異なり、BSONではフィールドの順序が決まっています。
そのため、ドキュメントを比較する場合、フィールドの順序は重要です。
{a: 1, b: 1}
と{a: 1, b: 1}
= 同じ{a: 1, b: 1}
と{b: 1, a: 1}
= 別物!
しかし、使用するクエリによっては順番が入れ替えられるものもあるので
注意が必要です。
ドキュメントは”コレクション”に格納される
コレクションとはRDBSでいうところのテーブルにあたります。
データベースの中にコレクション、
コレクションの中にドキュメントがあるという感じですね。
データを最初に保存する時に、指定したコレクション・データベースが
存在しない場合は、自動的に生成されます。
コレクション内のドキュメントが、全て同じスキーマを持つ必要はありません。
コレクションには一意な識別子(UUID:Universally Unique Identifier)が割り当てられます。
ObjectId
- MongoDBではIDの設定が必須です。
挿入したドキュメントで_idフィールドが省略された場合は、
タイムスタンプを用いて自動的に_idが設定されます。 - _idフィールドが主キーとして使用されます。
- _idフィールドはコレクション内で一意な値でなければいけません。
- _idフィールドは常にドキュメントの最初のフィールドとなります。
Model
👻Model(モデル)とは?
- MongoDBとやり取りするための主要なツール。クラス。
- schema(スキーマ:データ構造)を定義→スキーマをコンパイルしてモデルを作成
- モデルクラスのコンストラクタを使用することによりドキュメントが作成される
言葉の意味がいまいちわからない…という方へ
“クラス”や”インスタンス””サブクラス”の意味がわからないという方には
わわわさんの記事がオススメです!
超超超ざっくり解説すると、
- クラス=設計図
- インスタンス=クラスを元に実際に作ったもの
- サブクラス=クラスを継承したクラス
という感じです。
(随時更新していきます!)
コメント