ここではPythonでMongoDBを操作する方法を解説します。
MongoDBにデータを保存することで、大規模なデータを簡単に扱うことができるようになります。
MongoDBはデータベース(DB)の一種で、NoSQL(ノーエスキューエル)に分類されます。
NoSQLとはRDB以外のDBの総称です。MongoDBの他にCassandraやDynamoDB(AWS)があります。
RDBとNoSQLの比較
RDBはトランザクションを重要視しておりデータの整合性を保つことができます。
一方でNoSQLはデータの整合性を弱める代わりに、スケーラビリティや読み書き性能を高めたデータベースです。
用語の比較です
RDB | NoSQL |
---|---|
データベース | データベース |
テーブル | コレクション |
カラム | フィールド |
レコード | ドキュメント |
RDBでは各フィールドのデータ型やデータの大きさ、主キーの選択など、スキーマ定義が必要です。NoSQLはこのようなスキーマ定義が不要なため、スキーマレスと言われます。
・関連記事:PythonでMySQLを操作する(PyMySQL)
使用ライブラリ
PythonからMongoDBに接続するためのライブラリは PyMongo
になります。
インストール:必要
ライブラリのインストール
pip
コマンドで PyMongo
ライブラリをインストールします。
・関連記事:Pythonライブラリのインストール(pipの使い方)
1 | python -m pip install pymongo |
Successfully installed pymongo-*.*.* と表示されればインストールは成功です。
MongoDBを準備する
MySQLの事前準備について解説します。
すでにMySQLを導入していて、作成済のデータベースを利用する場合は飛ばしてください。
MongoDBのインストール(Windows)
MongoDBがPCにインストールされていない場合はインストールします。
インストーラは公式サイトにアクセスして Community Server(無料版) をダウンロードします。
インストールが完了したら「C:\Program Files\MongoDB\Server\*.*\bin」に環境変数のPathを通しておきます。(*.*は、5.0などのバージョン)
MongoDBを起動する
コマンドプロンプトを開きMongoDBのサービスを起動します。
起動するには以下のように入力します。
1 | C:\>mongo |
下図のようにメッセージが表示され、MySQLを操作できる状態になります。
データベース一覧を表示してみます。show dbs
と入力するとデータベースの一覧が表示できます。
1 2 3 4 | >show dbs admin 0.000GB config 0.000GB local 0.000GB |
入力をやり直したい場合はCTRL+Cでクエリをキャンセルしてやり直す事ができます。
データを挿入する(insert_one)
データを挿入するには insert_one()
メソッドを使用します。
RDBにおけるテーブルは、MongoDBではコレクションになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 | from pymongo import MongoClient # MongoDBに接続 client = MongoClient('localhost', 27017) # testデータベースを取得 db = client.test # データベースのpostsコレクションを取得 collection = db.posts # 辞書データを挿入 collection.insert_one({'名前':'太郎', '住所':'東京'}) |
コレクションの全てのドキュメントには _id
フィールドが必要でプライマリーキーになります。
指定しなかった場合は挿入時に自動で付与されます。これはObjectIDと呼ばれ12バイトの識別子になります。
1 2 | from pymongo import MongoClient client = MongoClient('localhost', 27017) |
まずライブラリのインポートを行い MongoClient()
でインスタンスを作成します。
初期設定のままローカルにインストールしたMongoDBに接続する場合は、引数は省略可能です。
1 2 3 4 5 | # testデータベースを取得 db = client.test # データベースのpostsコレクションを取得 collection = db.posts |
データベースとコレクションは存在しない場合でも書き込み時に自動的に作成されます。
1 | collection.insert_one({'名前':'太郎', '住所':'東京'}) |
データを辞書形式で指定して insert_one()
でコレクションに挿入します。
またMongoDBはスキーマレスなので、既に登録されているデータのフィールドには無いフィールドとデータを後から登録することが可能です。(findの使用方法は後述)
1 2 3 4 5 6 | collection.insert_one({'名前':'次郎', '性別': '男', '住所':'東京', '年齢':32}) for data in collection.find(): print(data) # {'_id': ObjectId('62bd2fea6db9a070a56e27e7'), '名前': '太郎', '住所': '東京'} # {'_id': ObjectId('62bd2fea6db9a070a56e27e8'), '名前': '次郎', '住所': '東京', '年齢': 32} |
データを一括挿入する
データを一括挿入するには、insert_many()
メソッドを使用します。
1 2 3 | collection.insert_many([{"名前": '三郎', '住所': '神奈川', '年齢':26}, {"名前": '花子', '住所': '千葉', '年齢':28}, {"名前": '四郎', '住所': '東京', '年齢':43}]) |
データを取得する(find_one)
コレクションからデータを取得するには find_one()
メソッドを使用します。
ただし、find_one()
では一番初めに登録されたデータしか表示されません。
1 2 | collection.find_one() #{'_id': ObjectId('62bd2fea6db9a070a56e27e7'), '名前': '太郎', '住所': '東京'} |
複数のデータを取得するには次の find()
メソッドを使用する必要があります。
全データを取得する(find)
コレクションから全てのデータを取得するには find()
メソッドを使用します。
1 2 3 4 5 6 7 8 | for data in collection.find(): print(data) # {'_id': ObjectId('62bd2fea6db9a070a56e27e7'), '名前': '太郎', '住所': '東京'} # {'_id': ObjectId('62bd2fea6db9a070a56e27e8'), '名前': '次郎', '住所': '東京', '年齢': 32} # {'_id': ObjectId('62bd2fea6db9a070a56e27e9'), '名前': '三郎', '住所': '神奈川', '年齢': 26} # {'_id': ObjectId('62bd2fea6db9a070a56e27ea'), '名前': '花子', '住所': '千葉', '年齢': 28} # {'_id': ObjectId('62bd2fea6db9a070a56e27eb'), '名前': '四郎', '住所': '東京', '年齢': 43} |
find()
の引数にクエリを指定すると、そのクエリにマッチするドキュメントが取得できます。
1 2 3 4 5 6 | for data in collection.find({'pref':'東京'}): print(data) # {'_id': ObjectId('62bd2fea6db9a070a56e27e7'), '名前': '太郎', '住所': '東京'} # {'_id': ObjectId('62bd2fea6db9a070a56e27e8'), '名前': '次郎', '住所': '東京', '年齢': 32} # {'_id': ObjectId('62bd2fea6db9a070a56e27eb'), '名前': '四郎', '住所': '東京', '年齢': 43} |
データを更新する(update_one)
登録済のデータを更新するには update_one()
メソッドを使用します。
条件に最初にマッチしたデータのみが対象になります。複数データを処理する場合は後述の update_many()
を使用します。
値を上書き
値の上書き更新には set
演算子を使用します。
1 2 3 4 5 6 | # 名前が三郎のドキュメントの住所を埼玉に変更 collection.update_one({'名前':'三郎'}, {'$set':{'住所':'埼玉'}}) for data in collection.find({'名前':'三郎'}): print(data) # {'_id': ObjectId('62bce2ba62d558b963a1e7f0'), '名前': '三郎', '住所': '埼玉', '年齢': 26} |
値を増加・減少
データが数値の場合は追加する値(正負)を指定することで、数値の加算減算を行うことができます。
演算子は inc
を使用します。(MongoDB 5.0以降対応)
1 2 3 4 5 6 | # 名前が三郎のドキュメントの年齢に10を加算 collection.update_one({'名前':'三郎'}, {'$inc':{'年齢':10}}) for data in collection.find({'名前':'三郎'}): print(data) # {'_id': ObjectId('62bd2fea6db9a070a56e27e9'), '名前': '三郎', '住所': '埼玉', '年齢': 36} |
フィールド名を変更
フィールドの更新も可能です。演算子は rename
を使用します。(MongoDB 5.0以降対応)
1 2 3 4 5 6 | # 名前が三郎のフィールド名年齢をageに変更 collection.update_one({'名前':'三郎'}, {'$rename':{'年齢':'age'}}) for data in collection.find({'名前':'三郎'}): print(data) # {'_id': ObjectId('62bd2fea6db9a070a56e27e9'), '名前': '三郎', '住所': '埼玉', 'age': 36} |
データを一括で更新する(update_many)
登録済のデータを一括で更新するには update_many()
を使用します。
値を上書き
値の上書き更新には set
演算子を使用します。
1 2 3 4 5 6 7 8 9 10 | # 住所が東京のドキュメントの住所を福岡に変更 collection.update_many({'住所':'東京'}, {'$set':{'住所':'福岡'}}) for data in collection.find(): print(data) # {'_id': ObjectId('62bd2fea6db9a070a56e27e7'), '名前': '太郎', '住所': '福岡'} # {'_id': ObjectId('62bd2fea6db9a070a56e27e8'), '名前': '次郎', '住所': '福岡', '年齢': 32} # {'_id': ObjectId('62bd2fea6db9a070a56e27e9'), '名前': '三郎', '住所': '埼玉', 'age': 36} # {'_id': ObjectId('62bd2fea6db9a070a56e27ea'), '名前': '花子', '住所': '千葉', '年齢': 28} # {'_id': ObjectId('62bd2fea6db9a070a56e27eb'), '名前': '四郎', '住所': '福岡', '年齢': 43} |
第一引数の辞書を空({})で指定すると全ドキュメントが対象になります。
1 2 3 4 5 6 7 8 9 10 | # 全てのドキュメントの住所を東京に変更 collection.update_many({}, {'$set':{'住所':'沖縄'}}) for data in collection.find(): print(data) # {'_id': ObjectId('62bd2fea6db9a070a56e27e7'), '名前': '太郎', '住所': '沖縄'} # {'_id': ObjectId('62bd2fea6db9a070a56e27e8'), '名前': '次郎', '住所': '沖縄', '年齢': 32} # {'_id': ObjectId('62bd2fea6db9a070a56e27e9'), '名前': '三郎', '住所': '沖縄', 'age': 36} # {'_id': ObjectId('62bd2fea6db9a070a56e27ea'), '名前': '花子', '住所': '沖縄', '年齢': 28} # {'_id': ObjectId('62bd2fea6db9a070a56e27eb'), '名前': '四郎', '住所': '沖縄', '年齢': 43} |
値を増加・減少
データが数値の場合は追加する値(正負)を指定することで、数値の加算減算を行うことができます。
演算子は inc
を使用します。(MongoDB 5.0以降対応)
1 2 3 4 5 6 7 8 9 10 | # 年齢フィールドの値に10を加算 collection.update_one({}, {'$inc':{'年齢':10}}) for data in collection.find(): print(data) # {'_id': ObjectId('62bd2fea6db9a070a56e27e7'), '名前': '太郎', '住所': '福岡', '年齢': 10} # {'_id': ObjectId('62bd2fea6db9a070a56e27e8'), '名前': '次郎', '住所': '福岡', '年齢': 42} # {'_id': ObjectId('62bd2fea6db9a070a56e27e9'), '名前': '三郎', '住所': '埼玉', 'age': 46} # {'_id': ObjectId('62bd2fea6db9a070a56e27ea'), '名前': '花子', '住所': '千葉', '年齢': 38} # {'_id': ObjectId('62bd2fea6db9a070a56e27eb'), '名前': '四郎', '住所': '福岡', '年齢': 53} |
フィールド名を変更
フィールドの更新も可能です。演算子は rename
を使用します。(MongoDB 5.0以降対応)
1 2 3 4 5 6 7 8 9 10 | collection.update_many({}, {'$rename':{'年齢':'age'}}) for data in collection.find(): print(data) # {'_id': ObjectId('62bd2fea6db9a070a56e27e7'), '名前': '太郎', '住所': '福岡', 'age': 20} # {'_id': ObjectId('62bd2fea6db9a070a56e27e8'), '名前': '次郎', '住所': '福岡', 'age': 42} # {'_id': ObjectId('62bd2fea6db9a070a56e27e9'), '名前': '三郎', '住所': '埼玉', 'age': 10} # {'_id': ObjectId('62bd2fea6db9a070a56e27ea'), '名前': '花子', '住所': '千葉', 'age': 38} # {'_id': ObjectId('62bd2fea6db9a070a56e27eb'), '名前': '四郎', '住所': '福岡', 'age': 53} |
データを削除する(delete_one)
データを削除するには delete_one()
を使用します。
条件に最初にマッチしたデータのみが対象になります。
1 2 3 4 5 6 7 8 | collection.delete_one({'名前':'太郎'}) for data in collection.find(): print(data) # {'_id': ObjectId('62bd2fea6db9a070a56e27e8'), '名前': '次郎', '住所': '福岡', 'age': 42} # {'_id': ObjectId('62bd2fea6db9a070a56e27e9'), '名前': '三郎', '住所': '埼玉', 'age': 10} # {'_id': ObjectId('62bd2fea6db9a070a56e27ea'), '名前': '花子', '住所': '千葉', 'age': 38} # {'_id': ObjectId('62bd2fea6db9a070a56e27eb'), '名前': '四郎', '住所': '福岡', 'age': 53} |
データを一括で削除する(delete_many)
データを一括で削除するには delete_many()
を使用します。
1 2 3 4 5 6 | collection.delete_one({'住所':'福岡'}) for data in collection.find(): print(data) # {'_id': ObjectId('62bd2fea6db9a070a56e27e9'), '名前': '三郎', '住所': '埼玉', 'age': 10} # {'_id': ObjectId('62bd2fea6db9a070a56e27ea'), '名前': '花子', '住所': '千葉', 'age': 38} |
PythonでMongoDBを操作する方法を解説しました。