MongoDB

MongoDB入門!NoSQLドキュメントDBの基本操作

MongoDB

MongoDB入門!
NoSQLドキュメントDBの基本操作

MongoDBはJSON形式のドキュメントでデータを管理するNoSQLデータベースです。基本操作を解説します。

こんな人向けの記事です

  • NoSQLデータベースを初めて学ぶ人
  • RDBMSとの違いを理解したい人
  • MongoDBのCRUD操作を覚えたい人

Step 1MongoDBとは

MongoDBはドキュメント指向のNoSQLデータベースです。JSON(BSON)形式でデータを保存します。

RDBMSとMongoDBの比較
# RDBMS          →  MongoDB
# Database       →  Database
# Table          →  Collection
# Row            →  Document
# Column         →  Field
# JOIN           →  Embedded Document / Reference
# PRIMARY KEY    →  _id(自動生成)

# MongoDBの特徴
# 1. スキーマレス: ドキュメントごとに構造が異なってもOK
# 2. JSONライク: データがJSONに近い形式(BSON)
# 3. 水平スケーリング: シャーディングで分散
# 4. 柔軟なクエリ: リッチなクエリ演算子
# 5. 高速な読み書き: インメモリ処理

# いつMongoDBを使うか
# - スキーマが頻繁に変わるアプリ
# - ネストされた複雑なデータ構造
# - 大量の読み書きが必要なシステム
# - ログ、IoTデータ、コンテンツ管理

Step 2インストールと起動

ターミナル
# Docker(推奨)
docker run -d --name mongodb -p 27017:27017   -e MONGO_INITDB_ROOT_USERNAME=admin   -e MONGO_INITDB_ROOT_PASSWORD=password   mongo:7

# macOS
brew tap mongodb/brew
brew install mongodb-community
brew services start mongodb-community

# 接続
mongosh
# または
mongosh "mongodb://admin:password@localhost:27017"

# 基本コマンド
show dbs              # データベース一覧
use mydb              # データベース選択(なければ作成)
show collections      # コレクション一覧
db.stats()            # DB統計情報

Step 3CRUD操作

mongosh
// === Create(追加) ===
db.users.insertOne({
  name: "田中太郎",
  age: 30,
  email: "tanaka@example.com",
  skills: ["Python", "Django", "MongoDB"]
})

db.users.insertMany([
  { name: "佐藤花子", age: 25, email: "sato@example.com" },
  { name: "鈴木一郎", age: 35, email: "suzuki@example.com" }
])

// === Read(取得) ===
db.users.find()                         // 全件取得
db.users.findOne({ name: "田中太郎" })  // 1件取得
db.users.find({ age: { $gte: 30 } })    // 30歳以上

// === Update(更新) ===
db.users.updateOne(
  { name: "田中太郎" },
  { $set: { age: 31 }, $push: { skills: "Redis" } }
)

db.users.updateMany(
  { age: { $lt: 30 } },
  { $set: { status: "young" } }
)

// === Delete(削除) ===
db.users.deleteOne({ name: "佐藤花子" })
db.users.deleteMany({ status: "inactive" })

Step 4クエリとフィルタ

mongosh
// 比較演算子
db.users.find({ age: { $gt: 25 } })    // 25より大きい
db.users.find({ age: { $gte: 25 } })   // 25以上
db.users.find({ age: { $lt: 30 } })    // 30未満
db.users.find({ age: { $ne: 30 } })    // 30以外
db.users.find({ age: { $in: [25, 30, 35] } })  // いずれか

// 論理演算子
db.users.find({ $and: [{ age: { $gte: 25 } }, { age: { $lte: 35 } }] })
db.users.find({ $or: [{ age: 25 }, { age: 35 }] })

// 配列クエリ
db.users.find({ skills: "Python" })           // 配列にPythonを含む
db.users.find({ skills: { $size: 3 } })       // 配列の長さが3
db.users.find({ skills: { $all: ["Python", "Django"] } }) // 両方含む

// プロジェクション(取得フィールド指定)
db.users.find({}, { name: 1, email: 1, _id: 0 })

// ソートとリミット
db.users.find().sort({ age: -1 }).limit(5).skip(10)

Step 5インデックスと集約

mongosh
// インデックス
db.users.createIndex({ email: 1 })              // 単一フィールド
db.users.createIndex({ name: 1, age: -1 })      // 複合インデックス
db.users.createIndex({ email: 1 }, { unique: true }) // ユニーク

db.users.getIndexes()  // インデックス一覧

// 集約パイプライン(Aggregation)
db.orders.aggregate([
  // Stage 1: フィルタ
  { $match: { status: "completed" } },

  // Stage 2: グルーピングと集計
  { $group: {
      _id: "$customer_id",
      totalAmount: { $sum: "$amount" },
      orderCount: { $sum: 1 },
      avgAmount: { $avg: "$amount" }
  }},

  // Stage 3: ソート
  { $sort: { totalAmount: -1 } },

  // Stage 4: 上位5件
  { $limit: 5 }
])
集約パイプライン
SQLのGROUP BYやJOINに相当する処理をパイプライン形式で記述します。各ステージの出力が次のステージの入力になります。

Step 6Pythonから使う(PyMongo)

Python
# pip install pymongo
from pymongo import MongoClient
from datetime import datetime

# 接続
client = MongoClient("mongodb://admin:password@localhost:27017")
db = client["myapp"]
users = db["users"]

# 追加
user = {
    "name": "田中太郎",
    "age": 30,
    "email": "tanaka@example.com",
    "created_at": datetime.now()
}
result = users.insert_one(user)
print(f"ID: {result.inserted_id}")

# 検索
user = users.find_one({"name": "田中太郎"})
print(user)

# 条件検索
young_users = users.find({"age": {"": 30}}).sort("age", 1)
for u in young_users:
    print(f"{u['name']}: {u['age']}歳")

# 更新
users.update_one(
    {"name": "田中太郎"},
    {"": {"age": 31}, "": {"skills": "MongoDB"}}
)

# 削除
users.delete_one({"name": "田中太郎"})

# 集約
pipeline = [
    {"": {"_id": None, "avg_age": {"": ""}}},
]
result = list(users.aggregate(pipeline))
print(f"平均年齢: {result[0]['avg_age']:.1f}")

まとめ

  • MongoDBはJSON形式でデータを保存するNoSQL DB
  • スキーマレスで柔軟なデータ構造が可能
  • insertOne/find/updateOne/deleteOneでCRUD操作
  • 集約パイプラインで複雑な集計処理
  • PyMongoでPythonから簡単に操作可能