プロジェクト

全般

プロフィール

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"]}')


約1ヶ月前に更新