[CentOS7][Python3] Pymongoの基本的な使い方
Pymongoの基本的な使い方の紹介。
前提
以下の手順でMongoDBをインストールし、MongoDBを起動しておく。
venvで仮想環境の構築とpymongoのインストール
venvで仮想環境を切ってpymongoをインストールする。
$ pyvenv ~/mongo_python $ source ~/mongo_python/bin/activate (mongo_python)$ pip install --upgrade pymongo (mongo_python)$ pip install pymongo
以降のサンプルコードはこちら
データを挿入する
~/mongo_pythonディレクトリ配下にsourceディレクトリを作成し、そこにソースを設置していく。
最初にデータを挿入してみる。insert_oneメソッドを利用するとデータを一つ挿入できる。
データを挿入するデータベース、コレクション(RDBでいうところのテーブル)は、データを挿入すると勝手に作成される。
$ mkdir ~/mongo_python/source $ cd ~/mongo_python/source $ vi mongo.py
# -*- coding: utf-8 -*- from pymongo import MongoClient if __name__ == "__main__": # MongoDBへの接続 mongo_client = MongoClient('localhost:27017') # データベースの選択 db_connect = mongo_client["db_name"] # コレクションを指定し、データを挿入する #db_connect["collection_name"].insert_one({'x':1})
mongo.pyを実行し、データを挿入する。
データが挿入されたかをMongoDBにアクセスして確認する。
$ python mongo.py $ mongo > show databases; db_name 0.078GB local 0.078GB > use db_name switched to db db_name > show collections collection_name system.indexes > db["collection_name"].find() { "_id" : ObjectId("557b95ffa24587070fe585a1"), "x" : 1 } <- データが挿入されている。
複数のデータを挿入する場合は、insert_manyメソッドを利用する。
挿入するデータの生成はリスト内包表記を使用している。
# -*- coding: utf-8 -*- from pymongo import MongoClient if __name__ == "__main__": mongo_client = MongoClient('localhost:27017') db_connect = mongo_client["db_name"] # データをたくさん挿入する db_connect["collection_name"].insert_many([{'x':i} for i in range(2,10)])
先ほどと同じようにデータが挿入されていることを確認する。
$ mongo > show databases; db_name 0.078GB local 0.078GB > use db_name switched to db db_name > show collections collection_name system.indexes > db["collection_name"].find() { "_id" : ObjectId("557b95ffa24587070fe585a1"), "x" : 1 } { "_id" : ObjectId("557b9693a24587071f6d1404"), "x" : 2 } { "_id" : ObjectId("557b9693a24587071f6d1405"), "x" : 3 } { "_id" : ObjectId("557b9693a24587071f6d1406"), "x" : 4 } { "_id" : ObjectId("557b9693a24587071f6d1407"), "x" : 5 } { "_id" : ObjectId("557b9693a24587071f6d1408"), "x" : 6 } { "_id" : ObjectId("557b9693a24587071f6d1409"), "x" : 7 } { "_id" : ObjectId("557b9693a24587071f6d140a"), "x" : 8 } { "_id" : ObjectId("557b9693a24587071f6d140b"), "x" : 9 }
データを取得する
findメソッドを利用してデータを取得する。
# -*- coding: utf-8 -*- from pymongo import MongoClient if __name__ == "__main__": mongo_client = MongoClient('localhost:27017') db_connect = mongo_client["db_name"] # データを取得する collection_list = db_connect["collection_name"].find() for x in collection_list: print(x)
実行してデータが取得できたかを確認する。
$ python mongo.py {'_id': ObjectId('557b95ffa24587070fe585a1'), 'x': 1} {'_id': ObjectId('557b9693a24587071f6d1404'), 'x': 2} {'_id': ObjectId('557b9693a24587071f6d1405'), 'x': 3} {'_id': ObjectId('557b9693a24587071f6d1406'), 'x': 4} {'_id': ObjectId('557b9693a24587071f6d1407'), 'x': 5} {'_id': ObjectId('557b9693a24587071f6d1408'), 'x': 6} {'_id': ObjectId('557b9693a24587071f6d1409'), 'x': 7} {'_id': ObjectId('557b9693a24587071f6d140a'), 'x': 8} {'_id': ObjectId('557b9693a24587071f6d140b'), 'x': 9}
findメソッドの引数に以下のように指定することで条件検索できる。
# 条件検索(x==3のものを抽出) collection_list = db_connect["collection_name"].find({'x':3}) # OR検索(x==1 or x==5 のものを抽出) collection_list = db_connect["collection_name"].find({"$or":[ {"x":1}, {"x":5}]}) # AND検索(x==1 and x==5 のものを抽出) collection_list = db_connect["collection_name"].find({"$and":[ {"x":1}, {"x":5}]})
データを変更する
データの変更はreplaceメソッドがある。
まずreplaceメソッドでデータの変更を行う。
# -*- coding: utf-8 -*- from pymongo import MongoClient if __name__ == "__main__": mongo_client = MongoClient('localhost:27017') db_connect = mongo_client["db_name"] # データを変更する db_connect["collection_name"].replace_one({'x': 1}, {'x': 4}) # データを取得する collection_list = db_connect["collection_name"].find() for x in collection_list: print(x)
データが変更されたかを確認する。
$ python mongo.py {'_id': ObjectId('557b95ffa24587070fe585a1'), 'x': 4} {'_id': ObjectId('557b9693a24587071f6d1404'), 'x': 2} {'_id': ObjectId('557b9693a24587071f6d1405'), 'x': 3} {'_id': ObjectId('557b9693a24587071f6d1406'), 'x': 4} {'_id': ObjectId('557b9693a24587071f6d1407'), 'x': 5} {'_id': ObjectId('557b9693a24587071f6d1408'), 'x': 6} {'_id': ObjectId('557b9693a24587071f6d1409'), 'x': 7} {'_id': ObjectId('557b9693a24587071f6d140a'), 'x': 8} {'_id': ObjectId('557b9693a24587071f6d140b'), 'x': 9}
また、update_oneメソッド、update_manyメソッドでも行える。
# -*- coding: utf-8 -*- from pymongo import MongoClient if __name__ == "__main__": mongo_client = MongoClient('localhost:27017') db_connect = mongo_client["db_name"] # x==1に該当するデータの4に変更する db_connect["collection_name"].update_one({'x': 1}, {'$set': {'x': 4}}) # データを取得する collection_list = db_connect["collection_name"].find() for x in collection_list: print(x)
変更を確認する。
$ python mongo.py {'_id': ObjectId('557b95ffa24587070fe585a1'), 'x': 4} {'_id': ObjectId('557b9693a24587071f6d1404'), 'x': 2} {'_id': ObjectId('557b9693a24587071f6d1405'), 'x': 3} {'_id': ObjectId('557b9693a24587071f6d1406'), 'x': 4} {'_id': ObjectId('557b9693a24587071f6d1407'), 'x': 5} {'_id': ObjectId('557b9693a24587071f6d1408'), 'x': 6} {'_id': ObjectId('557b9693a24587071f6d1409'), 'x': 7} {'_id': ObjectId('557b9693a24587071f6d140a'), 'x': 8} {'_id': ObjectId('557b9693a24587071f6d140b'), 'x': 9}
また、update_oneメソッド、update_manyメソッドは変わったデータの更新が行える。
一例として、上の例で $set にしたところを $inc に変えることでデータの加算が行える。
# -*- coding: utf-8 -*- from pymongo import MongoClient if __name__ == "__main__": mongo_client = MongoClient('localhost:27017') db_connect = mongo_client["db_name"] # x==2に該当するすべてのデータのxに100加算する db_connect["collection_name"].update_many({'x': 4}, {'$inc': {'x': 100}}) # データを取得する collection_list = db_connect["collection_name"].find() for x in collection_list: print(x)
x==4だったところが100加算されていることがわかる。
$ python mongo.py {'x': 104, '_id': ObjectId('557b95ffa24587070fe585a1')} {'x': 2, '_id': ObjectId('557b9693a24587071f6d1404')} {'x': 3, '_id': ObjectId('557b9693a24587071f6d1405')} {'x': 104, '_id': ObjectId('557b9693a24587071f6d1406')} {'x': 5, '_id': ObjectId('557b9693a24587071f6d1407')} {'x': 6, '_id': ObjectId('557b9693a24587071f6d1408')} {'x': 7, '_id': ObjectId('557b9693a24587071f6d1409')} {'x': 8, '_id': ObjectId('557b9693a24587071f6d140a')} {'x': 9, '_id': ObjectId('557b9693a24587071f6d140b')}
データを消去する
delete_oneメソッド、delete_manyメソッドを利用することでデータの削除が行える。
# -*- coding: utf-8 -*- from pymongo import MongoClient if __name__ == "__main__": mongo_client = MongoClient('localhost:27017') db_connect = mongo_client["db_name"] # x==3に該当するデータを消去する # db_connect["collection_name"].delete_one({'x': 3}) # データを取得する collection_list = db_connect["collection_name"].find() for x in collection_list: print(x)
データが一つ削除されたことを確認する。
$ python mongo.py {'x': 104, '_id': ObjectId('557b95ffa24587070fe585a1')} {'x': 2, '_id': ObjectId('557b9693a24587071f6d1404')} {'x': 104, '_id': ObjectId('557b9693a24587071f6d1406')} {'x': 5, '_id': ObjectId('557b9693a24587071f6d1407')} {'x': 6, '_id': ObjectId('557b9693a24587071f6d1408')} {'x': 7, '_id': ObjectId('557b9693a24587071f6d1409')} {'x': 8, '_id': ObjectId('557b9693a24587071f6d140a')} {'x': 9, '_id': ObjectId('557b9693a24587071f6d140b')}
複数のデータも削除してみる。
# -*- coding: utf-8 -*- from pymongo import MongoClient if __name__ == "__main__": mongo_client = MongoClient('localhost:27017') db_connect = mongo_client["db_name"] # x==104に該当するデータを複数消去する db_connect["collection_name"].delete_many({'x': 104}) # データを取得する collection_list = db_connect["collection_name"].find() for x in collection_list: print(x)
x==104のデータがすべて削除されていることがわかる。
$ python mongo.py {'_id': ObjectId('557b9693a24587071f6d1404'), 'x': 12} {'_id': ObjectId('557b9693a24587071f6d1407'), 'x': 5} {'_id': ObjectId('557b9693a24587071f6d1408'), 'x': 6} {'_id': ObjectId('557b9693a24587071f6d1409'), 'x': 7} {'_id': ObjectId('557b9693a24587071f6d140a'), 'x': 8} {'_id': ObjectId('557b9693a24587071f6d140b'), 'x': 9}