MongoDBとは
MongoDBは、汎用的なドキュメント指向の分散データベースです。JSONライクな形式(BSON)でデータを格納し、スキーマの柔軟性と高いスケーラビリティを提供します。公式サイトでは「現代のアプリケーション開発者とクラウド時代のために構築された」と説明されています。
代表的なクライアントツール
- MongoDB Compass(公式・無料): GUIツール。クエリ、集計、パフォーマンス分析を可能に。macOS/Windows/Linux対応。ReadOnly版やStandalone版も存在。
- Studio 3T(有料): IDEやクライアント機能を統合した高機能GUI。
- Navicat for MongoDB(有料): 14日間試用版あり。
- NoSQL Manager for MongoDB Professional(有料): 管理・開発用GUI。
MongoDBの基本概念
MongoDBは「データベース」「コレクション」「ドキュメント」という階層構造を持ちます。これはリレーショナルデータベースの「データベース」「テーブル」「行」に類似しますが、スキーマレスの点が大きく異なります。
| RDBMS用語 | MongoDB用語 | 説明 |
|---|---|---|
| database | database | データベース |
| table | collection | コレクション(テーブル相当) |
| row | document | ドキュメント(行相当) |
| column | field | フィールド(列相当) |
| index | index | インデックス |
| table joins | (なし) | 結合はサポートされず、埋め込みドキュメントで代替 |
| primary key | _id(自動生成) | 主キーは自動的に_idフィールドに設定 |
データベース
MongoDBのインスタンスは複数のデータベースを保持可能。各データベースは独立したコレクションと権限を持ちます。特別なデータベースとしてadmin(管理用)、local(レプリカ非対象)、config(シャーディング設定)があります。
データベース名の制約: 空文字不可、スペース・$・/・\・ヌル文字不可、小文字のみ、最大64バイト。
ドキュメント
ドキュメントはキーと値のペア(BSON形式)で構成。フィールドの型は自由で、ネストも可能。特徴:
- キーと値の順序が保持される
- 値は文字列だけでなく、数値・真偽値・配列・埋め込みドキュメントなど
- 大文字小文字を区別、型も区別
- 同一ドキュメント内でキーの重複不可
- キーはUTF-8文字列(ヌル文字禁止)
コレクション
コレクションはドキュメントのグループ。RDBMSのテーブルと異なりスキーマレスで、異なる構造のドキュメントを混在可能。ただし実運用では関連性のあるデータをまとめることが多い。
コレクション名の制約: 空文字不可、ヌル文字禁止、system.で始まるものは予約済み、$を含むのはシステム生成を除き非推奨。
Capped Collections
固定サイズのコレクション。挿入順に自動的に古いドキュメントを上書き。ログやoplog(oplog.rs)に使用。サイズを指定して作成し、更新時のサイズ増加は不可。drop()で全削除後、再作成が必要。
db.createCollection("mycoll", { capped: true, size: 100000 })
メタデータ
システム情報はdbname.system.*コレクションに格納。例:system.namespaces(名前空間一覧)/system.indexes(インデックス)/system.profile(プロファイリング)/system.users(ユーザー)。これらの変更には制限あり。
MongoDBのデータ型
| データ型 | 説明 |
|---|---|
| String | UTF-8文字列 |
| Integer | 32bitまたは64bit整数 |
| Boolean | true/false |
| Double | 倍精度浮動小数点数 |
| Array | 配列/リスト |
| Timestamp | BSON内部用タイムスタンプ(64bit: 秒+増分) |
| Object | 埋め込みドキュメント |
| Null | 空値 |
| Symbol | シンボル(ほぼ文字列と同義) |
| Date | Unixエポックからのミリ秒(1970年以前は負数) |
| ObjectID | 12バイトの一意識別子(タイムスタンプ・マシンID・PID・カウンタ) |
| Binary Data | バイナリデータ |
| Code | JavaScriptコード |
| Regular expression | 正規表現 |
ObjectIDの詳細
ObjectIDは_idのデフォルト値。12バイト構成:
- 先頭4バイト:UNIXタイムスタンプ(UTC)
- 次の3バイト:マシン識別子
- 次の2バイト:プロセスID
- 最後の3バイト:ランダムカウンタ
作成時刻取得:
var oid = ObjectId();
oid.getTimestamp(); // ISODate("2023-10-05T12:00:00Z")
文字列変換:
oid.str; // "651e9a3f..."
日付型の扱い
var d1 = new Date(); // 現在時刻(UTC)
var d2 = ISODate(); // 同上
typeof d1; // object
d1.toString(); // "Sun Mar 04 2018 14:58:51 GMT+0000 (UTC)"
基本操作
データベース操作
show dbs:データベース一覧表示(admin, config, local がデフォルト)use <dbName>:データベースの作成/切替(初回はメモリ上に作成、コレクション作成時に永続化)db.dropDatabase():現在のデータベース削除
コレクション操作
- 作成:
db.createCollection("collectionName", {optional options}) - 参照:
show collections - 削除:
db.collectionName.drop()(成功時 true)
オプション例:
db.createCollection("logs", { capped: true, size: 5242880, max: 1000 })
ドキュメント操作
挿入
insertOne():単一ドキュメント挿入insertMany():複数ドキュメント挿入insert():単一または複数
例:
db.members.insertOne({
name: "田中 太郎",
age: NumberInt(28),
gender: "男",
city: "東京"
});
db.members.insertMany([
{ name: "鈴木 花子", age: NumberInt(32), gender: "女", city: "大阪" },
{ name: "佐藤 健", age: NumberInt(45), gender: "男", city: "名古屋" }
]);
db.members.insert([
{ account: { name: "山田" }, emails: ["yamada@example.com"], cards: [{ bank: "みずほ", num: "123456" }] },
{ account: { name: "吉田" }, emails: ["yoshida@test.jp"], cards: [{ bank: "三菱UFJ", num: "789012" }] }
]);
更新(upsert)関連
update()、updateOne()、updateMany()にupsert: trueを指定すると、該当ドキュメントが存在しない場合は新規挿入。その他findOneAndUpdate()、findOneAndReplace()、save()、bulkWrite()なども利用可能。