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から簡単に操作可能