実践では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 ~]# 
      
  
  
  
  