Mongo Shell 操作まとめ

スポンサーリンク

実践では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 ~]# 
タイトルとURLをコピーしました