当サイトは、アフィリエイト広告を利用しています

【Docker × MongoDB】コンテナでMongoDBを作って操作してみる~mongo-express~

作成日:2024月06月10日
更新日:2024年06月23日

Dockerを使ってMongoDBコンテナを作成し、MongoDBを操作してみる
MongoDBの操作は

  • mongosh
  • mongo-express

のあるが今回は「mongo-express」を使う

mongo-expressはWEBのUIで感覚的に操作できるので
まずはMongoDBのデータ構造のイメージをつかむために
簡単な操作をする場合には便利だと思う

mongoshでの操作については下記記事でまとめています
mongoshはコマンドで操作することになる。

MongoDBとは?

MongoDBはNoSQLは、従来のリレーショナルデータベース(RDB)とは
異なる方法でデータを処理・操作する

ドキュメント指向型

MongoDBはNoSQLのドキュメント指向型のDBで JSONやXMLといったデータ形式で記述されたドキュメントの形でデータを管理する。

利点としてはJSONやXMLといったデータ形式でかつ階層構造を持たず、相互の関係が横並びに管理
されるため、複雑な構造を持つことができます。さまざまなデータを保存することができる

MongoDBのデータ構造

ドキュメント指向型のMongoDBではデータを

  • データベース
  • コレクション
  • ドキュメント

の単位で扱う

データベース

データベース。
一番大きな単位。これはRDBと同じ

コレクション

コレクションはRDBでいうことろのテーブルに相当する
ドキュメントの集まり

ドキュメント

ドキュメントはRDBでいうことろのレコードに相当する

mongo-expressとは?

mongo-expressはNode.jsとExpressを使用して書かれているWebベースのMongoDB管理インターフェース
mongo-expressは、複数のデータベースに接続し、データベースやコレクションの表示、追加、削除、ドキュメント
の編集などを行うことができる。

具体的なデータが見えるので慣れないうちはmongoshよりもmongo-expressを
使った方がイメージをつかみやすいと思う

環境

下記の環境で行う

  • Windows11
  • Docker version 26.1.1(Docker for Windows)
  • VScode
  • Remote Development(VScodeの拡張機能)

WindowsでDocker for Windowsを使って行う

プロジェクト構成

下記のような構成にする

プロジェクト構成
.
|-- docker-compose.yml
`-- mongo
|-- db
`-- init
`-- init-db.js
  • コンテナ作成用にdocker-compose.ymlを用意する
  • mongodb用にmongoディレクトリを作っておく

MongoDBのコンテナ環境を作成する

docker-composeを使って

  • MongoDBコンテナ
  • mongo-expressコンテナ

を作ってデータを確認してみる

コンテナ作成時の注意点

mongo_expressコンテナは一応、mongodbより後に起動するようになっているが
それでもmongodbの方が遅いときがある。

なのでmongo_expressにアクセスできない時は
少し待ってみたらアクセスできるようになる。

docker-compose.yml

コンテナの設定をする

docker-compose.yml
version: "3"
services:
# MongoDBコンテナ
mongodb:
container_name: "mongodb"
restart: always
image: mongo:6.0.13
ports:
- "27017:27017"
volumes:
- ./mongo/init:/docker-entrypoint-initdb.d # 初期化スクリプト
- mongoDataStore:/data/db # MongoDBのデータファイル
# - ./mongo/db:/data/db
environment:
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.2
restart: always
ports:
- "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コンテナとmongo_expressコンテナを作る
  • MongoDBのデータは名前付きボリュームで管理する

ME_CONFIG_MONGODB_SERVER,ADMINUSERNAME,ADMINPASSWORDについて

この三つはmongodbで設定している値と
合わせておく必要がある

/data/dbについて

MongoDBのデータの保存場所
名前付きボリュームではなく、バインドマウントにしたい場合はコメントアウト
している方を使う

docker-entrypoint-initdb.dについて

docker-entrypoint-initdb.dにShell ScriptかJavaScriptで
書いたスクリプトがあれば、コンテナ起動時に実行してくれるのでホストから
バインドマウントしている

初期化時にユーザーを作りたい、またはDBに初期データを入れたい
時に使える

init-db.jsについて

初期化スクリプト

init-db.js
// 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.");
  • ユーザー作成
  • DBにコレクションを追加

MongoDBはdbに少なくも1つのコレクションをがないとデータベースとして
認識しないので、MONGO_INITDB_DATABASEで設定している「mongotable」に
対して初期化スクリプトでコレクションを作成している。
※この初期化スクリプトがないとmongotableは作成されない

mongo_expressで操作する

docker-compose.ymlで作成したMongoDBコンテナを
mongo_expressで操作してみる

mongo_expressを表示する

mongo_expressはWebベースのMongoDB管理インターフェースなので
ブラウザで開くことができる

docker-compose.ymlでbindしているport番号が8081なので「http://localhost:8081」
で開くことができる
2024-06-07-01-18-09

初期データベースとして登録したmongotableがあるのがわかる

データベース操作

mongo_expressでデータベースを操作してみる

データベース作成

2024-06-07-01-21-10

実行するとデータベースが作成される
2024-06-07-01-21-50

削除

削除はDelを押せば削除できる
※押下後に確認ダイアログがでる
2024-06-07-01-23-21

コレクション操作

mongo_expressでコレクションを操作してみる

データベースに入ると自動で「delete_me」コレクションができている
多分、MongoDBはdbに少なくも1つのコレクションをがないとデータベースとして
認識しないためだと思われる
2024-06-07-01-26-12 必要ないので別のコレクションを作った後は削除する

コレクション作成

2024-06-09-19-09-10

コレクション編集

作成し、usersコレクションを開くと色々と編集できる
2024-06-09-19-10-57

コレクション削除

データベースのコレクション一覧画面でDelボタンを
押せば削除できる
2024-06-09-19-11-42

ドキュメント操作

ドキュメントの操作をしてみる

ドキュメント作成(手動)

2024-06-09-19-33-33

コレクションの画面で「New Document」を選択し
JSON形式で入力するとドキュメントを登録できる

ドキュメントexport

データベースの画面で「Export」、「JSON」を選択すると
選択したコレクションのデータを取得できる
「JSON」はJSON形式でexportする
2024-06-09-19-36-39

ドキュメント作成(import)

上記と同じ画面で「import」すればJSON形式でexportしたデータはimportすることができる
※「Export」でとったデータはimportできなかった
2024-06-09-19-38-56

ドキュメント検索(Simple)

2024-06-09-19-41-10 条件を入れて検索すると

2024-06-09-19-43-22 検索ができる

ドキュメント検索(Advanced)

Advancedタブではqueryとprojectionを設定して
検索できる
2024-06-09-19-49-45

ドキュメント編集

コレクションのところでドキュメントの編集ボタンを
押すとドキュメントを編集できる
2024-06-09-19-51-42

押すと編集画面へ遷移する編集してsaveすればいい
2024-06-09-19-53-00

ドキュメント削除

ドキュメントの削除はゴミ箱ボタンでできる
2024-06-09-19-53-58

まとめ

MongoDBのmongodb-expressを使った基本的な操作方法を
まとめてみた。

データが視覚的にわかるのでイメージはmongoshよりも
つきやすいと思う。

またデータの確認や簡単なデータ作成などにも使いやすそうだと感じた

参考

関連記事

新着記事

top