code & booze

自己学習とは無縁なSIer業界に身を置くエンジニアがアウトプットします

PythonでMongoDBに接続する方法

PythonでMongoDBに接続する手順メモ。

はじめに

最近はPythonばかり使っていて、色々なWebAPI叩いて遊んでます。

公開されているAPIを使うと大量のデータが簡単に手に入るのですが、データ取得⇒MongoDBに格納⇒解析という流れでやってます。
今回はPythonからMongoDBに接続する手順を備忘として記載します。

MongoDB on Docker

まず接続を行うMongoDBを用意する必要がありますが、Dockerでちゃちゃっと用意します。

MongoDBのデータをWebUIで確認できるmongo-expressもあわせて起動するようにしてみます。

version: "3.5"
services:
  mongo:
    image: mongo:4.0
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: password
    ports:
      - "27017:27017"
  mongo-express:
    image: mongo-express
    ports:
      - "8081:8081"
    environment:
      ME_CONFIG_MONGODB_ADMINUSERNAME: root
      ME_CONFIG_MONGODB_ADMINPASSWORD: password
    depends_on:
      - mongo

docker-composeの定義はこんな感じで、MongoDBは27017port、mongo-expressは8081portで接続できるようにします。
データの永続化はしていませんので必要な場合は追加でvolumeを定義します。

Pythonで接続

pymongoのインストール

PythonからMongoDBを使うためにpymongoをインストールします。

$ pipenv install pymongo

※pipでも当然OK

Pythonコード

MongoDBに接続してドキュメントを1件登録するコードを書いてみます。

from pymongo import MongoClient

client = MongoClient("mongodb://root:password@192.168.99.100:27017")
# DB接続(存在しない場合は作成)
db = client["testdb"]
# collection接続(存在しない場合は作成)
collection = db["test_collection"]

# 1件登録
collection.insert_one({"name": "TestA", "age": 100})

client.close()

私の環境ではDocker ToolBoxを使用しているため、clientのホスト名にdocker machinのIPアドレスを指定しています。
Docker Desktopを使用している場合はlocalhost指定でOKです。

なおDBとcollectionは無い場合作成されるのですが、作成されるタイミングはドキュメントを登録した時となります。insertを行わずに終了した場合は作成されないことに注意してください。

実行コマンドは↓

py mongo_test.py

Mongo-expressで確認

WebUIで確認してみます。上記で定義したdocker-composeで起動していれば合わせてMongo-expressが起動してるはずです。

<docker-machinのIP>:8081もしくはlocalhost:8081へアクセスします。

f:id:kiy-s:20190412002008p:plain QiitaのAPIで色々やっていたのでそれ用のDBがありますが、、先ほどのtestdbもちゃんとできています。

f:id:kiy-s:20190412002337p:plain DB⇒コレクションと辿っていくとドキュメントまで確認することができます。
先ほどInsertしたデータも登録されています。_idは自動で採番される一意のIDです。

ちなみにこの画面ではデータの編集も可能となっていて、結構便利です(Guiでデータを編集していくというのはあまりないかもしれないですが。。)

おわりに

今回利用したライブラリのpymongoは公式のドキュメントが充実しているので、基本的にはそれに沿って使えば問題ないと思います↓↓

api.mongodb.com