近年、ビッグデータやリアルタイムアプリケーションの増加に伴い、柔軟かつスケーラブルなNoSQLデータベースの需要が高まっています。
その中でもMongoDBは、ドキュメント指向で扱いやすく、Pythonとの相性も良いため、初心者からプロまで広く利用されています。
本記事では、PythonからMongoDBを利用する方法を、接続から基本的な操作、さらには簡単な応用例まで、ステップ・バイ・ステップで解説します。
環境構築
PythonとMongoDBを動かすための環境を準備します。
Pythonのインストール
- Python 3.7以上を公式サイトからインストールします。
- python –version でバージョン確認。
MongoDBのインストール
- MongoDB Community Editionを公式サイトからダウンロードしてインストール。
- Windowsならサービス起動、macOS/Linuxならbrewやaptでインストールし、mongodコマンドで起動。
仮想環境の作成
mkdir python-mongodb-demo
cd python-mongodb-demo
python -m venv venv
source venv/bin/activate # Windows: venv\\Scripts\\activate
必要パッケージのインストール
pip install pymongo
MongoDBとは
MongoDBはドキュメント指向データベースで、JSONライクなBSONという形式でデータを保存します。
従来のリレーショナルデータベースと異なり、スキーマレス(柔軟な構造)なので、扱うデータに応じて自由にフィールドを追加できます。
特徴
- スキーマレスで柔軟
- スケーラブルな水平分割(シャーディング)
- 複数ノードでのレプリケーションによる高可用性
PyMongoのインストールと接続
Python用の公式ドライバであるPyMongoを使って接続します。
from pymongo import MongoClient
# ローカルのMongoDBに接続(デフォルトポート27017)
client = MongoClient('mongodb://localhost:27017/')
# データベースを指定
db = client['sample_db']
MongoClient にURIを渡すことでリモートサーバへの接続も可能です。
データベースとコレクションの操作
MongoDBでは、データベース → コレクション(テーブル相当) → ドキュメント(レコード相当)の階層構造です。
# 新しいコレクションを指定(存在しなければ自動作成)
collection = db['users']
CRUD操作の実践
Create(作成)
user = {'name': 'Alice', 'age': 25, 'email': 'alice@example.com'}
result = collection.insert_one(user)
print(f"Inserted ID: {result.inserted_id}")
Read(読み取り)
# 全件取得
for doc in collection.find():
print(doc)
# 条件検索
alice = collection.find_one({'name': 'Alice'})
print(alice)
Update(更新)
collection.update_one(
{'name': 'Alice'},
{'$set': {'age': 26}}
)
Delete(削除)
collection.delete_one({'name': 'Alice'})
インデックスとクエリ最適化
検索を高速化するためにインデックスを作成します。
# 単一フィールドインデックス
collection.create_index('email')
# 複合インデックス
collection.create_index([('age', 1), ('name', -1)])
応用:Pythonでの簡易Webアプリ連携例
Flaskを使って簡易的なREST APIを作成してみましょう。
pip install flask
from flask import Flask, jsonify, request
app = Flask(__name__)
@app.route('/users', methods=['GET'])
def get_users():
users = list(collection.find({}, {'_id': 0}))
return jsonify(users)
@app.route('/users', methods=['POST'])
def add_user():
data = request.json
collection.insert_one(data)
return jsonify({'status': 'success'})
if __name__ == '__main__':
app.run(debug=True)
演習問題
- products コレクションを作成し、複数の商品ドキュメントを挿入するPythonコードを記述せよ。
- 挿入した商品のうち、価格が5000以上のドキュメントを抽出するクエリを作成せよ。
- 特定の商品の在庫数を更新するコードを記述せよ。
- 在庫が0の商品を一括で削除するコードを記述せよ。
- price フィールドに対して昇順インデックスを作成するコードを記述せよ。
解答例
from pymongo import MongoClient
client = MongoClient('mongodb://localhost:27017/')
db = client['sample_db']
products = db['products']
# 1. 複数ドキュメント挿入
sample_products = [
{'name': 'Laptop', 'price': 80000, 'stock': 10},
{'name': 'Mouse', 'price': 1500, 'stock': 50},
{'name': 'Keyboard', 'price': 3000, 'stock': 0},
{'name': 'Monitor', 'price': 20000, 'stock': 5}
]
products.insert_many(sample_products)
# 2. 価格が5000以上の抽出
for item in products.find({'price': {'$gte': 5000}}):
print(item)
# 3. 在庫数更新
products.update_one(
{'name': 'Laptop'},
{'$set': {'stock': 8}}
)
# 4. 在庫0の商品を削除
products.delete_many({'stock': 0})
# 5. price昇順インデックス作成
products.create_index([('price', 1)])
まとめ
本記事では、PythonからMongoDBに接続し、基本的なCRUD操作やインデックスの活用、Flaskを使った簡易API連携までを解説しました。
演習問題で手を動かすことで理解を深め、実際のプロジェクトで応用できる力を養いましょう。
これで、初心者向けのMongoDB入門は完了です。次は、レプリケーションやシャーディング、高度な集計フレームワークなどさらに深いトピックに挑戦してみてください!