dockerでmongodb構築
docker run -d --name dev-mongo -p 27017:27017 mvertes/alpine-mongo
-d:バックグラウンドで起動する
--name dev-mongo:dev-mongoという名前をつける
-p:ホストの27017ポートでアクセスしたら、コンテナの27017に転送する
mvertes/alpine-mongo:alpineを利用したmongoのイメージ
起動確認
この記事中は、起動させたままにします。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a3d250b5c18b mvertes/alpine-mongo "/root/run.sh mongod" 2 seconds ago Up 3 seconds 0.0.0.0:27017->27017/tcp, 28017/tcp dev-mongo
先ほどの設定が生きています。
IMAGEにはmvertes/alpine-mongo
PORTSでホストの27017からコンテナの27017に転送指定
NAMESにはdev-mongo
補足として、停止と削除は以下のコマンドから。
$ docker stop dev-mongo
$ docker rm dev-mongo
アクセス
dev-mongo内部のアクセス
docker exec -it dev-mongo /bin/sh
dev-mongo内でmongoコマンド
mongo
mongo関連のコマンドの抜粋
// 終了
quit()
// adminで操作
use admin
// コレクションの一覧
show collections
それらを実行した時のコード
$ docker exec -it dev-mongo /bin/sh
bash-4.3# psql -U postgres
psql (10.1)
> use admin
switched to db admin
> quit()
/ # exit
テスト準備
npmでmongodbをインストールします。
typescriptを使いたいので、@types/mongodbもインストールします。
npm install mongodb @types/mongodb --save
テストコード
test.ts
import * as mongodb from "mongodb";
import { Db } from "mongodb";
const MongoClient = new mongodb.MongoClient();
let mongoDb: Db;
// db名
const dbName = "TEST";
// allTest()メソッドを実行
allTest()
.then( () => {
// 成功した場合
console.log( "Complete" );
} )
.catch( ( e ) => {
// 失敗した場合
console.warn( e );
} );
/**
* 全テスト実行
**/
async function allTest() {
await before();
// 1000件インサート
await insertTest();
// todo 必要ならここに他のテストのメソッドを追加したり
}
/**
* 事前実行
**/
async function before(): Promise<any> {
const db = await MongoClient.connect( "mongodb://localhost:27017/" );
try {
// テストで使用したいdb名と同名のdbがあったらdrop
await db.dropCollection( dbName );
} catch ( err ) {
// 存在しない場合は無視
}
// 新しくdbを作る
await db.createCollection( dbName );
mongoDb = db;
}
/**
* 挿入テスト
**/
async function insertTest() {
const coll = mongoDb.collection( dbName );
const timeName = "1000件インサート";
console.time( timeName );
const len = 1000 | 0;
let i = 0 | 0;
while ( i < len ) {
i = (i + 1) | 0;
await coll.insertOne( {
id: i,
name: `username${i}`
} );
}
console.timeEnd( timeName );
const count = await coll.count( {} );
if ( count === len ) {
console.log( "SUCCESS" );
} else {
console.log( "FAILURE" );
}
}
ちょっと訳あって普通にコード書いてますが、テストは普通にmocha使ってpower-assertで判定した方がいいと思います。
(というか実際はそうしているのであとで書き直すかも)