Python MongoDB¶
MongoDBアクセス・ライブラリ¶
pipでインストールします。
pip¶
$ pip install pymongo :
pymongoとdnspythonがインストールされました。
PyMongoページのDependenciesにdnspythonが記載されています。mongodb+srv://
形式のURIを解決する場合にdnspythonが必要とあります。
使い方¶
MongoDBへの接続¶
from pymongo import MongoClient
def usecase1():
client = MongoClient() # localhostのデフォルトポート 27017 に接続
...
client.close() # closeが必要
def usecase2():
client = MongoClient("192.168.16.3", 27017) # ホスト、ポートを指定して接続
...
client.close()
def usecae3():
client = MongoClient("mongodb://192.168.16.3:27017") # URL形式でホスト・ポートを指定して接続
...
client.close()
def usecase4():
with MongoClient() as client: # with文で close呼び出しを自動化
...
実際の接続はデータアクセスをした時点で発生¶
上述のMongoClientをインスタンス化した時点では、MongoDBへの接続は行われておりません。続くデータベースへのアクセスで接続ができない場合、タイムアウト時間を経過してアクセスAPIがエラー(例外)を発行します。
接続確認¶
client.admin.command('ping') で
def isConnect(client):
try:
client.admin.command('ping')
return True
except Exception as e:
print(e)
return False
def connect():
with MongoClient(MONGODB_URL) as client:
if (isConnect(client)):
print("connect: Success")
else:
print("connect: Fail")
データベースの取得¶
データベースの名前一覧を取得するサンプルです。
def connect():
with MongoClient(MONGODB_URL) as client:
print(client.list_database_names())
- database_names()はdeprecatedとなり、pymongo 4.6.1で削除
データベース名を指定してデータベースオブジェクトを取得する場合、
db = client["weather"]
のように(辞書的)アクセスする方法db = client.weather
のようにプロパティ的にアクセスする方法
データベースからコレクションの取得¶
コレクション名にハイフンが含まれている時は、うまく動作しない模様です。
取得済みのデータベースから、コレクションの名前一覧を取得するサンプルです。
db.list_collection_names()
コレクション名を指定してコレクションオブジェクトを取得する場合、次のようにいくつかの呼び出しが可能です。
mycollection = db['sensors']
mycollection = db.sensors
mycollection = db.get_collection('sensors')
コレクションからドキュメントの取得¶
コレクションオブジェクトにfindメソッドで条件などを指定して合致したドキュメントを取得します。
例1)emailフィールドが存在するドキュメントを抽出¶
mycollection.find({'email': {'$exists': True}})
- $existsは、特定のフィールドを持つ(True)、持たない(False)ドキュメントを対象とします
例2)ageフィールドが20以上のドキュメントを抽出¶
mycollection.find({'age': {'$gte': 20}})
- $gteは、フィールドの値が指定値(ここでは20)以上(greater than or equals to)のドキュメントを抽出
抽出したドキュメントのうち指定フィールドを出力¶
mycollection.find(projection={'name', 'age', 'address'}, filter={'age': {'$gte': 20}})
上述例では、指定していない'_id'フィールドが出力されます。これを抑制するには、projectionで、'_id':0 と指定します。
この時、残りに出力するフィールドには:1を付与する必要があります。
mycollection.find(projection={'_id':0, 'name':1, 'age':1, 'address':1}, filter={'age': {'$gte': 20}})
- projectionに、出力するドキュメントのフィールドを指定します
抽出したドキュメントを指定のフィールドの昇順・降順に出力¶
from pymongo import DESCENDING
:
mycollection.find(filter={'age': {'$gte': 20}}, sort=[('age', DESCENDING)])
ドキュメントからフィールドの取得¶
members = mycollection.find(filter={'age': {'$gte': 20}}, sort=[('age', DESCENDING)])
for member in members:
print(f'name={member["name"]}, age={member["age"]}, address={member["address"]}')