はじめてのPythonとMongoDB入門: 基礎から学ぶNoSQLデータベース活用法

近年、ビッグデータやリアルタイムアプリケーションの増加に伴い、柔軟かつスケーラブルな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)

演習問題

  1. products コレクションを作成し、複数の商品ドキュメントを挿入するPythonコードを記述せよ。
  2. 挿入した商品のうち、価格が5000以上のドキュメントを抽出するクエリを作成せよ。
  3. 特定の商品の在庫数を更新するコードを記述せよ。
  4. 在庫が0の商品を一括で削除するコードを記述せよ。
  5. 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入門は完了です。次は、レプリケーションやシャーディング、高度な集計フレームワークなどさらに深いトピックに挑戦してみてください!