当サイトは、アフィリエイト広告を利用しています
Dockerを使ってMongoDBコンテナを作成し、MongoDBを操作してみる
MongoDBの操作は
のあるが今回は「mongo-express」を使う
mongo-expressはWEBのUIで感覚的に操作できるので
まずはMongoDBのデータ構造のイメージをつかむために
簡単な操作をする場合には便利だと思う
mongoshでの操作については下記記事でまとめています
mongoshはコマンドで操作することになる。
MongoDBはNoSQLは、従来のリレーショナルデータベース(RDB)とは
異なる方法でデータを処理・操作する
MongoDBはNoSQLのドキュメント指向型のDBで JSONやXMLといったデータ形式で記述されたドキュメントの形でデータを管理する。
利点としてはJSONやXMLといったデータ形式でかつ階層構造を持たず、相互の関係が横並びに管理
されるため、複雑な構造を持つことができます。さまざまなデータを保存することができる
ドキュメント指向型のMongoDBではデータを
の単位で扱う
データベース。
一番大きな単位。これはRDBと同じ
コレクションはRDBでいうことろのテーブルに相当する
ドキュメントの集まり
ドキュメントはRDBでいうことろのレコードに相当する
mongo-expressはNode.jsとExpressを使用して書かれているWebベースのMongoDB管理インターフェース
mongo-expressは、複数のデータベースに接続し、データベースやコレクションの表示、追加、削除、ドキュメント
の編集などを行うことができる。
具体的なデータが見えるので慣れないうちはmongoshよりもmongo-expressを
使った方がイメージをつかみやすいと思う
下記の環境で行う
WindowsでDocker for Windowsを使って行う
下記のような構成にする
.|-- docker-compose.yml`-- mongo|-- db`-- init`-- init-db.js
docker-composeを使って
を作ってデータを確認してみる
mongo_expressコンテナは一応、mongodbより後に起動するようになっているが
それでもmongodbの方が遅いときがある。
なのでmongo_expressにアクセスできない時は
少し待ってみたらアクセスできるようになる。
コンテナの設定をする
version: "3"services:# MongoDBコンテナmongodb:container_name: "mongodb"restart: alwaysimage: mongo:6.0.13ports:- "27017:27017"volumes:- ./mongo/init:/docker-entrypoint-initdb.d # 初期化スクリプト- mongoDataStore:/data/db # MongoDBのデータファイル# - ./mongo/db:/data/dbenvironment:MONGO_INITDB_ROOT_USERNAME: admin # MongoDBの管理者のユーザー名MONGO_INITDB_ROOT_PASSWORD: admin123 # MongoDBの管理者のパスワードMONGO_INITDB_DATABASE: mongotable # 初期DBの作成# mongo_expressコンテナmongo_express:container_name: "mongo_express"image: mongo-express:1.0.2restart: alwaysports:- "8081:8081"environment:ME_CONFIG_MONGODB_SERVER: mongodb # Mongo Expressが接続するMongoDBのサーバーを指定(MongoDBのサービス名)ME_CONFIG_MONGODB_ADMINUSERNAME: admin # MongoDBの管理者(rootユーザー)のユーザー名(Mongo ExpressがMongoDBに接続する際に使用)ME_CONFIG_MONGODB_ADMINPASSWORD: admin123 # MongoDBの管理者(rootユーザー)のパスワード(Mongo ExpressがMongoDBに接続する際に使用)ME_CONFIG_BASICAUTH_USERNAME: admin # Mongo Expressへの基本認証のユーザー名ME_CONFIG_BASICAUTH_PASSWORD: password # Mongo Expressへの基本認証のパスワードdepends_on:mongodb:condition: service_started # mongoコンテナが起動してから起動させる# 名前付きボリュームvolumes:mongoDataStore:name: mongoDataStore
この三つはmongodbで設定している値と
合わせておく必要がある
MongoDBのデータの保存場所
名前付きボリュームではなく、バインドマウントにしたい場合はコメントアウト
している方を使う
docker-entrypoint-initdb.dにShell ScriptかJavaScriptで
書いたスクリプトがあれば、コンテナ起動時に実行してくれるのでホストから
バインドマウントしている
初期化時にユーザーを作りたい、またはDBに初期データを入れたい
時に使える
初期化スクリプト
// init-db.js// 管理者ユーザーでログインdb = db.getSiblingDB("admin");db.auth("admin", "admin123");// 新しいユーザーを作成db.createUser({user: "example_user",pwd: "password123",roles: [{ role: "readWrite", db: "mongotable" }],});// mongotable データベースに接続するdb = db.getSiblingDB("mongotable");// コレクションを作成するdb.createCollection("example_collection");// サンプルドキュメントを挿入するdb.example_collection.insertOne({key: "value",});print("Initialization completed.");
MongoDBはdbに少なくも1つのコレクションをがないとデータベースとして
認識しないので、MONGO_INITDB_DATABASEで設定している「mongotable」に
対して初期化スクリプトでコレクションを作成している。
※この初期化スクリプトがないとmongotableは作成されない
docker-compose.ymlで作成したMongoDBコンテナを
mongo_expressで操作してみる
いつまでもmongo_expressをブラウザで表示できない場合は
下記コマンドでコンテナにログイン後
mongoshでmongodbにログインするとつながることが多い
# コンテナにログインdocker exec -it mongodb sh# mongoshでmongodbに接続mongosh mongodb://admin:admin123@localhost:27017/admin
ブラウザ表示がうまくいった場合は
を求められるのでdocker-compose.ymlで設定している
の値を入力すれば入れる。
※当記事の設定通りに進めていれば、「admin」と「password」になっている。
mongo_expressはWebベースのMongoDB管理インターフェースなので
ブラウザで開くことができる
docker-compose.ymlでbindしているport番号が8081なので「http://localhost:8081」
で開くことができる
初期データベースとして登録したmongotableがあるのがわかる
mongo_expressでデータベースを操作してみる
削除はDelを押せば削除できる
※押下後に確認ダイアログがでる
mongo_expressでコレクションを操作してみる
データベースに入ると自動で「delete_me」コレクションができている
多分、MongoDBはdbに少なくも1つのコレクションをがないとデータベースとして
認識しないためだと思われる
必要ないので別のコレクションを作った後は削除する
データベースのコレクション一覧画面でDelボタンを
押せば削除できる
ドキュメントの操作をしてみる
コレクションの画面で「New Document」を選択し
JSON形式で入力するとドキュメントを登録できる
データベースの画面で「Export」、「JSON」を選択すると
選択したコレクションのデータを取得できる
「JSON」はJSON形式でexportする
上記と同じ画面で「import」すればJSON形式でexportしたデータはimportすることができる
※「Export」でとったデータはimportできなかった
Advancedタブではqueryとprojectionを設定して
検索できる
コレクションのところでドキュメントの編集ボタンを
押すとドキュメントを編集できる
MongoDBのmongodb-expressを使った基本的な操作方法を
まとめてみた。
データが視覚的にわかるのでイメージはmongoshよりも
つきやすいと思う。
またデータの確認や簡単なデータ作成などにも使いやすそうだと感じた