LoginSignup
0
0

More than 3 years have passed since last update.

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

Posted at

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}]
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0