実践ではMongoDBへはJavaやNode.jsなどのアプリケーションコードで接続します。しかし、設定変更等の運用操作や状況確認等のデバッグを目的として、簡易的なコマンドラインツールもMongoDBに限らず殆どのデータベースソフトウェアで提供されています。このページでは簡易的なコマンドラインツールのMongo Shell(mongosh)の操作方法についてまとめます。
前提
公式ドキュメント
参考になる公式ドキュメントを以下に示します。
動作確認済環境
- Rocky Linux 8.6
- MongoDB Server 6.0.2
接続方法
ヘルプ表示
mongoshの接続方法に迷った場合は、以下のようにhelpオプションを付与する事で使い方を表示する事ができます。また、ターミナルソフトではなくブラウザでヘルプを見たい方は「Mongo Shell Options」を参照しても差し支えございません。
[root@linux010 ~]# mongosh --help $ mongosh [options] [db address] [file names (ending in .js or .mongodb)] Options: -h, --help Show this usage information -f, --file [arg] Load the specified mongosh script --host [arg] Server to connect to --port [arg] Port to connect to --version Show version information --verbose Increase the verbosity of the output of the shell --quiet Silence output from the shell during the connection process --shell Run the shell after executing files --nodb Don't connect to mongod on startup - no 'db address' [arg] expected --norc Will not run the '.mongoshrc.js' file on start up --eval [arg] Evaluate javascript --json[=canonical|relaxed] Print result of --eval as Extended JSON, including errors --retryWrites[=true|false] Automatically retry write operations upon transient network errors (Default: true) Authentication Options: -u, --username [arg] Username for authentication -p, --password [arg] Password for authentication --authenticationDatabase [arg] User source (defaults to dbname) --authenticationMechanism [arg] Authentication mechanism --awsIamSessionToken [arg] AWS IAM Temporary Session Token ID --gssapiServiceName [arg] Service name to use when authenticating using GSSAPI/Kerberos --sspiHostnameCanonicalization [arg] Specify the SSPI hostname canonicalization (none or forward, available on Windows) --sspiRealmOverride [arg] Specify the SSPI server realm (available on Windows) <omitted>
オプションによる接続先指定
オプションなしでmongoshを実行した場合は、localhost:27017のMongoDBサーバへ接続します。それ以外のMongoDBサーバへ接続したい場合は、以下のように、IPアドレスとポート番号を指定します。
mongosh \ --host <MongoDBサーバのIPアドレス> \ --port <MongoDBサーバのポート番号> \ <データベース名>
もし認証を必要とする場合は、usernameとpasswordを指定します。
mongosh \ --host <MongoDBサーバのIPアドレス> \ --port <MongoDBサーバのポート番号> \ --username <ユーザ名> \ --password <パスワード> \ <データベース名>
URIによる接続先指定
前述の操作例ではmongoshにhostやportなどのオプションを指定する接続例を紹介しました。このような接続方法以外にも、接続先をURIで指定する方法もあります。例えば、IPアドレスとポート番号を明示指定してURIで接続するには、以下のように操作します。
mongosh mongodb://<MongoDBサーバのIPアドレス>:<MongoDBサーバのポート番号>/<データベース名>
ユーザ名とパスワードを明示指定するならば、URIは以下のようになります。
mongosh mongodb://<ユーザ名>:<パスワード>@<MongoDBサーバのIPアドレス>:<MongoDBサーバのポート番号>/<データベース名>
JavaScriptの実行
対話実行
mongoshはJavaScriptの実行が可能です。例えば、以下のように変数を定義したりループを使用したりする事ができます。
test> var loop = 10; test> for (var i = 0; i < loop; i++){ ... db.testMessages.insertOne({id_: i , text: "This is test message " + i + "."}) ... } { acknowledged: true, insertedId: ObjectId("635e8ed396a5f9184b9430d3") } test>
コマンドラインによるJavaScript実行
evalオプションを付与する事でJavaScriptをコマンドラインから実行する事ができます。マニュアルを見る限りではevalオプションしか紹介されていませんが、私が調べた限りではevalオプション以外でも以下のような実行方法が存在するようです。
- evalオプションで指定する
- 標準入力として与える
- ファイルとして指定する
以下のようにevalオプションでJavaScriptを実行する事もできます。
mongosh mongodb://localhost:27017/test --eval 'show dbs'
JavaScriptのファイルを作成し、これを引数に与える事でも実行できます。
cat << 'EOF' > sample.js for (var seq = 0; seq <= 100; seq++){ db.logSample.insertOne({_id: seq, text: "This is test data. ", createdAt: new Date()}) } EOF mongosh mongodb://localhost:27017/test sample.js
標準入力としてJavaScriptを与えても差し支えございません。
echo 'db.inventory.insertMany([ { item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" }, { item: "notebook", qty: 50, size: { h: 8.5, w: 11, uom: "in" }, status: "A" }, { item: "paper", qty: 100, size: { h: 8.5, w: 11, uom: "in" }, status: "D" }, { item: "planner", qty: 75, size: { h: 22.85, w: 30, uom: "cm" }, status: "D" }, { item: "postcard", qty: 45, size: { h: 10, w: 15.25, uom: "cm" }, status: "A" } ]);' | mongosh mongodb://localhost:27017/test
ヒアドキュメントとして標準入力を与えるならば、以下のように記述します。
mongosh mongodb://localhost:27017/test << EOF db.inventory.insertMany([ { item: "canvas", qty: 100, size: { h: 28, w: 35.5, uom: "cm" }, status: "A" }, { item: "mat", qty: 85, size: { h: 27.9, w: 35.5, uom: "cm" }, status: "A" }, { item: "mousepad", qty: 25, size: { h: 19, w: 22.85, uom: "cm" }, status: "P" }, { item: "sketchbook", qty: 80, size: { h: 14, w: 21, uom: "cm" }, status: "A" }, { item: "sketch pad", qty: 95, size: { h: 22.85, w: 30.5, uom: "cm" }, status: "A" } ]); EOF
その他 小技
quiet
quietオプションを使うと接続時の情報が出力されなくなります。ログ取り作業をする時は、スッキリとしたログが残せるので便利でしょう。このサイトでもquietオプションは多用しています。
[root@linux010 ~]# mongosh --quiet test>
jqによる整形 – JSON.stringify
場合によってはMongoDBの出力をjqなどのJSONパーサーで整形したい要件に遭遇するかもしれません。
ですが、MongoDBが出力するのはJavaScriptのオブジェクトであり厳密にJSON形式になっているわけではありません。試しに「db.hostInfo().os」をjqによる整形を試みると、以下のようにエラーが出力されます。
[root@linux010 ~]# mongosh --quiet --eval 'db.hostInfo().os' { type: 'Linux', name: 'Rocky Linux release 8.6 (Green Obsidian)', version: 'Kernel 4.18.0-372.9.1.el8.x86_64' } [root@linux010 ~]# mongosh --quiet --eval 'db.hostInfo().os' | jq "." parse error: Invalid literal at line 2, column 7 [root@linux010 ~]#
MongoDBが出力する文字列をよく観察すると「type: ‘Linux’」と記述されています。厳密なJSONの形式に従うならば「’type’: ‘Linux’」と記述しなければなりません。そこで、JavaScriptのJSON.stringify()関数を使用する事を考えます。これはJSON形式に変換する関数です。
以下のようにJSON.stringify()を使用すると、jqによる整形が可能になった事が分かります。
[root@linux010 ~]# mongosh --quiet --eval 'JSON.stringify(db.hostInfo().os)' {"type":"Linux","name":"Rocky Linux release 8.6 (Green Obsidian)","version":"Kernel 4.18.0-372.9.1.el8.x86_64"} [root@linux010 ~]# mongosh --quiet --eval 'JSON.stringify(db.hostInfo().os)' | jq "." { "type": "Linux", "name": "Rocky Linux release 8.6 (Green Obsidian)", "version": "Kernel 4.18.0-372.9.1.el8.x86_64" } [root@linux010 ~]# mongosh --quiet --eval 'JSON.stringify(db.hostInfo().os)' | jq ".name" "Rocky Linux release 8.6 (Green Obsidian)" [root@linux010 ~]#