【2026年版】MongoDBの始め方 — NoSQLドキュメントDBの入門


ドキュメントモデル vs リレーショナルモデル RDB(テーブル) users テーブル id name age 1 Alice 30 addresses テーブル(別テーブル) user_id city country 1 Tokyo Japan JOIN が必要 MongoDB(ドキュメント) users コレクション { "_id": 1, "name": "Alice", "age": 30, "address": { "city": "Tokyo", "country": "Japan" } } ネストで1ドキュメントに収まる MongoDBはデータをJSONライクな構造でそのまま保存できる
ドキュメントモデルとリレーショナルモデルの違い
🎚 難易度 ★☆☆ 初心者向け
⏱ 学習時間の目安 読むだけ10分、環境構築込み25分
📚 前提知識 JSONの基本構造(キーと値のペア)を知っている・リレーショナルDBの概念(テーブル、行、列)をなんとなく知っている
✅ このガイドで学べること
  • MongoDBのドキュメントモデルとRDBとの違いを説明できる
  • CRUD操作(作成・読み取り・更新・削除)をMongoDB Shellで実行できる
  • MongoDB Atlasでクラウド上のDBを無料で使い始められる
  • インデックスと集計パイプラインの基本を理解できる

クイックリファレンス

MongoDB Atlasの始め方

1. mongodb.com/atlas → 無料アカウント作成
2. 「Create a deployment」→ M0 Free Cluster を選択
3. ユーザー名/パスワードを設定(Database Access)
4. IPアドレスを許可(Network Access)→ 0.0.0.0/0 で全許可(学習用)
5. Connect → Drivers → 接続文字列をコピー

ローカルインストール(Docker)

# MongoDB をDockerで起動
docker run -d \
  --name mongodb \
  -p 27017:27017 \
  -e MONGO_INITDB_ROOT_USERNAME=admin \
  -e MONGO_INITDB_ROOT_PASSWORD=password \
  mongo:7

# MongoDB Shell で接続
docker exec -it mongodb mongosh -u admin -p password

基本CRUD操作

// データベース・コレクション選択
use mydb

// ドキュメント挿入
db.users.insertOne({ name: "Alice", age: 30, tags: ["admin", "user"] })
db.users.insertMany([
  { name: "Bob", age: 25 },
  { name: "Carol", age: 35 }
])

// 検索
db.users.find()                          // 全件
db.users.find({ age: { $gt: 28 } })     // 年齢 > 28
db.users.findOne({ name: "Alice" })      // 1件

// 更新
db.users.updateOne(
  { name: "Alice" },
  { $set: { age: 31 }, $push: { tags: "superuser" } }
)

// 削除
db.users.deleteOne({ name: "Bob" })
db.users.deleteMany({ age: { $lt: 20 } })

インデックスと集計パイプライン

// インデックス作成
db.users.createIndex({ email: 1 })           // 昇順
db.users.createIndex({ name: 1, age: -1 })  // 複合インデックス
db.users.getIndexes()                        // インデックス確認

// 集計パイプライン(年齢別ユーザー数)
db.users.aggregate([
  { $match: { age: { $gte: 18 } } },
  { $group: { _id: "$age", count: { $sum: 1 } } },
  { $sort: { count: -1 } },
  { $limit: 5 }
])

よくある詰まりポイント

Q. find() で検索しているのに結果が返ってこない

A. MongoDBのクエリは大文字小文字を区別します。{name: "alice"}{name: "Alice"} は別物です。大文字小文字を無視して検索したい場合は {name: /alice/i} のように正規表現と i フラグを使ってください。

Q. 配列フィールドの要素を条件にして検索できない

A. 配列フィールドを直接値で検索できます。db.users.find({tags: "admin"})tags 配列に “admin” が含まれるドキュメントを返します。複数条件の場合は $all(すべて含む)や $elemMatch(要素の複合条件)を使いましょう。

Q. AtlasのクラスターにローカルのNode.jsから繋がらない

A. Network Accessで自分のIPアドレスが許可されているか確認してください。IPアドレスは動的に変わることがあるので、開発中は「Add Current IP Address」で最新のIPを追加するか、0.0.0.0/0 で全許可にするのが手軽です(本番環境では必ず制限してください)。

ひよこ ひよこ

MongoDBってRDBと何が違うの?テーブルじゃないの?

ペンギン先生 ペンギン先生

MongoDBドキュメント指向DBで、テーブルの代わりに「コレクション」、行の代わりに「ドキュメント」という単位でデータを扱うよ。ドキュメントJSONに似たBSONというフォーマットで、ネストした構造や配列もそのまま保存できるんだ。RDBのような固定スキーマがないから、フィールドを後から自由に追加できるのが特徴だよ。

ひよこ ひよこ

どんなときにMongoDBを選ぶといいの?

ペンギン先生 ペンギン先生

データ構造が頻繁に変わるプロトタイプ開発、ユーザーごとに異なる属性を持つプロフィールデータ、JSONのまま保存したいAPIレスポンスのキャッシュ、などに向いているよ。逆に複雑なJOINが必要な集計クエリや、トランザクションが多い金融システムにはRDBの方が適していることが多いよ。

ひよこ ひよこ

基本のCRUD操作ってどうやるの?

ペンギン先生 ペンギン先生

MongoDBシェルで直感的に操作できるよ。insertOne・find・updateOne・deleteOneの4つが基本メソッドで、find では {$gt: 25} のようなクエリ演算子でフィルタリングも柔軟にできるよ。

ひよこ ひよこ

MongoDB Atlasって何?ローカルにインストールしなくていいの?

ペンギン先生 ペンギン先生

AtlasはMongoDBの公式クラウドサービスだよ。アカウントを作ってブラウザで操作するだけでDBクラスターが立ち上がるんだ。無料枠(M0 Shared Cluster)は512MBのストレージが永続無料で使えるから、学習や小規模プロジェクトには十分だよ。接続文字列をコピーするだけでどの言語からも接続できる。

ひよこ ひよこ

インデックスって何のためにあるの?

ペンギン先生 ペンギン先生

インデックスは検索を速くするための索引だよ。インデックスなしだとコレクション全件をスキャン(コレクションスキャン)するけど、createIndex でemailにインデックスを張ると、そのフィールドでの検索が数百倍速くなることもあるんだ。explain('executionStats') で実際にインデックスが使われているか確認できるよ。

ひよこ ひよこ

集計パイプラインって難しそう…

ペンギン先生 ペンギン先生

SQLGROUP BYJOINに相当する機能だよ。複数のステージをパイプのように繋げるイメージで、$match(絞り込み)→ $group(集計)→ $sort(並び替え)みたいに書くんだ。例えば「年齢別のユーザー数を多い順に取得」なら $group と $sort を組み合わせたパイプラインで書けるよ。

ひよこ ひよこ

MongooseってよくNode.jsの記事で見るけど何?

ペンギン先生 ペンギン先生

MongooseはNode.js用のMongoDB ODM(Object Document Mapper)ライブラリだよ。スキーマを定義してバリデーションや型チェックができるから、「スキーマレス」のMongoDBに安全に型付き構造を持たせられるんだ。`Schema` でモデルを定義して `model.save()` で保存するという使い方が基本だよ。Pythonなら `Motor`(非同期)や `PyMongo`(同期)が主要ドライバーだよ。

次に学ぶなら