MongoDBのクライアントツール、基本概念、データ型の解説

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用語説明
databasedatabaseデータベース
tablecollectionコレクション(テーブル相当)
rowdocumentドキュメント(行相当)
columnfieldフィールド(列相当)
indexindexインデックス
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のデータ型

データ型説明
StringUTF-8文字列
Integer32bitまたは64bit整数
Booleantrue/false
Double倍精度浮動小数点数
Array配列/リスト
TimestampBSON内部用タイムスタンプ(64bit: 秒+増分)
Object埋め込みドキュメント
Null空値
Symbolシンボル(ほぼ文字列と同義)
DateUnixエポックからのミリ秒(1970年以前は負数)
ObjectID12バイトの一意識別子(タイムスタンプ・マシンID・PID・カウンタ)
Binary Dataバイナリデータ
CodeJavaScriptコード
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()なども利用可能。

タグ: MongoDB データベース BSON コレクション ドキュメント

6月22日 16:35 投稿