Queryを手軽に試せるMongoDB環境を作成する


MongoDBのQueryを手軽に試したかったので、その環境を構築した際のメモです。

目的から以下の3つを条件にツールを探しましたが、3つ全てを満たすのがなかなか見つからず、結局 Mongo Express とJupyter notebookを組み合わせました。Web UIの

  1. 複数人が手軽に利用できるようにWeb UIでアクセスできること
  2. サンプルデータを簡単にいれれること
  3. Aggregation Queryを実行できること

ソース

Dockerfile


FROM jupyter/scipy-notebook
ENV TZ=Asia/Tokyo
USER root
RUN pip install pymongo
USER $NB_UID

docker-compose.yml

version: '3.1'

services:
  mongo:
    image: mongo:3
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: example
    volumes:
      - ./data/db:/data/db
      - ./data/configdb:/data/configdb

  mongo-express:
    image: mongo-express
    ports:
      - 8081:8081
    restart: on-failure:10
    depends_on:
      - mongo
    environment:
      ME_CONFIG_MONGODB_ADMINUSERNAME: root
      ME_CONFIG_MONGODB_ADMINPASSWORD: example

  jupyter-notebook:
    build: .
    volumes:
      - ./data/notebook:/home/jovyan/work
    ports:
      - "8888:8888"
    environment:
      JUPYTER_TOKEN: jupyter
    depends_on:
      - mongo

開発時の一時利用なので、 restart:always は設定していません。
しかし、 mongo-express がMongoDBが立ち上がる前に起動し接続エラーで落ちてしまうので、restart: on-failure:10 を設定し、再試行するようにしています。

起動

docker-compose up -d

MongoDBが立ち上がるのに少し、時間がかかります。

実行

Mongo Express からサンプルデータ投入

アクセス先: http://localhost:8081
Database、Collection、Documentの作成がサクッとできます。

サンプルデータ投入
  1. Create Database - Create Collection でCollectionを作成。 ここでは、test, inventoryという名前で作成
  2. New Document で以下を貼り付けて Save
[
   { item: "journal", qty: 25, status: "A", size: { h: 14, w: 21, uom: "cm" }, tags: [ "blank", "red" ] },
   { item: "notebook", qty: 50, status: "A", size: { h: 8.5, w: 11, uom: "in" }, tags: [ "red", "blank" ] },
   { item: "paper", qty: 10, status: "D", size: { h: 8.5, w: 11, uom: "in" }, tags: [ "red", "blank", "plain" ] },
   { item: "planner", qty: 0, status: "D", size: { h: 22.85, w: 30, uom: "cm" }, tags: [ "blank", "red" ] },
   { item: "postcard", qty: 45, status: "A", size: { h: 10, w: 15.25, uom: "cm" }, tags: [ "blue" ] }
]

Jupyter notebook から接続

アクセス先: http://localhost:8888/?token=jupyter

上で作成したテストデータにJupyter notebookからアクセスします。
Jupyter notebookのコンテナからは、MongoDBにはmongodb://root:example@mongo:27017/ でアクセスできます。

例えば、statusごとの数を集計する場合は以下の感じです。

import pymongo
client = pymongo.MongoClient('mongodb://root:example@mongo:27017/')
col = client.test.inventory

pipeline = [
    {
        "$group": {"_id": "$status", "count": {"$sum":1}}
    }
]
list(col.aggregate(pipeline)) # ==> [{'_id': 'D', 'count': 2}, {'_id': 'A', 'count': 3}]