このページはCalíope 1.7を紹介しています。私がいま作っているバージョンです。1.6は、Mac、iPad、iPhone、Apple Watch、Apple TV、Apple Vision Pro向けにApp Storeで公開中です。それぞれの機能がどのバージョンで入ったかは変更履歴に書いてあります。

すべてのトピックに「Calíopeで開く」ボタンを追加します。アプリがインストールされている場合にのみ機能します。

MongoDB

コレクションとドキュメントを閲覧

MongoDBサーバのデータベース、コレクション、ドキュメントを見て回る方法。

場所: ワークスペース › ツール › コレクション

コレクションブラウザは、選んだデータベースのコレクションを左に、そのドキュメントを右に、折りたためるツリーとして表示します。

ドキュメントは行ではありません。隣り合う2つのドキュメントが1つもフィールドを共有しないこともあり、そのため列のグリッドはありません。各値にはその型(ObjectId、decimal128、日付、バイナリ)が表示されます。スキーマのないデータベースでは、それが情報の半分です。

編集するには鉛筆を押します。ドキュメントは拡張JSONとして開き、_idで識別されて丸ごと保存されます。_idのないドキュメントは編集も削除もできず、別のドキュメントに触れてしまうボタンを出す代わりに、そのことを伝えます。ビューは読み出し専用で、そう表示されます。上限付きコレクションにも印が付きます。

上部のメニューでデータベースを切り替え、「フィルタ」でコレクションの一覧を名前で絞り込みます。ドキュメントは50件ずつ届きます。フッターにはコレクション内の件数と読み込んだ件数が表示され、一覧の末尾にある「さらに読み込む」で次の50件を取得します。「新規ドキュメント」は同じエディタを空で開きます。「整形」は書いた内容のインデントを整え直し、読み取れない場合はテキストに触れずにその理由を伝えます。

CalíopeはMongoDB 4.0以降に接続します。それより古いバージョンでは、サーバが実行しているバージョンを示して接続を拒否します。

環境タグがある場合
プロファイルのタグが読み出し専用なら、ブラウザは「新規ドキュメント」も、ドキュメントの編集や削除も表示しません。読むことしかできません。書き込みを確認するタグなら、ドキュメントを保存する前にタグの名前を示して確認します。もともと確認を求める削除では、その質問にタグの名前が入り、二度は確認しません。

キーワード: MongoDB、コレクション、ドキュメント、BSON、JSON、閲覧

クエリーと集計

フィルタ、射影、並べ替え、集計パイプライン。

場所: ワークスペース › ツール › クエリー

クエリーツールには2つのモードがあります。「検索」はフィルタ、射影、並べ替えの順序を適用し、3つともJSONドキュメントとして書きます。「集計」は完全なパイプライン、つまりステージのリストを実行します。

「コレクション」メニューで、「コレクション」タブで選んだデータベースの中から問い合わせる対象を選び、「実行」(⌘↩)で送信します。フッターには読み込んだドキュメントの数と、サーバにかかったミリ秒が表示されます。各フィールドは拡張JSONを受け付けるので、{"$date": …}と{"$oid": …}はテキストではなく、日付とObjectIdとしてサーバに届きます。リストになっていないパイプラインは何かを送る前に検出され、それ以外でサーバが拒否したものはサーバ自身のメッセージとともに返ってきます。

結果はページ単位で届きます。続きは「さらに読み込む」で求めます。サーバ側のカーソルは、クエリーが変わったときか、このツールを離れたときに閉じられます。放置されたカーソルは、メモリーを抱えたまま10分間生き続けます。

結果はここでは編集しません。集計には変更を書き戻す元のドキュメントがなく、射影をかけた結果では、保存時に表示されていないフィールドが失われてしまいます。編集にはブラウザを使ってください。

フィルタとパイプラインに書く演算子にも説明があります。トピック「SQL関数のコンテキストヘルプ」で説明しています。

環境タグがある場合
「検索」は読むだけで、タグによって変わりません。$outや$mergeを含む集計はコレクションに書き込みます。タグが読み出し専用なら実行されず、通知がその理由を伝えます。書き込みを確認するタグなら、実行の前にタグの名前を示して確認します。

キーワード: MongoDB、クエリー、find、集計、パイプライン、フィルタ

コレクションのインデックス

一意、スパース、有効期限付きのものも含め、インデックスを表示、作成、削除します。

場所: ワークスペース › ツール › インデックス

バーの「コレクション」メニューでコレクションを選びます。ビューは一覧に出ません。ビューは自分のインデックスを持たないからです。ほかのMongoDBツールで選んだコレクションがビューなら、ツールは読み込む代わりにそう伝えます。一覧には各インデックスが名前で表示され、その下にキー、プロパティがタグとして並びます:一意、スパース、または有効期限付き(TTL)。テキストインデックスには対象のフィールドが、それぞれtextとともに表示されます。「更新」でサーバから一覧を読み直します。

「新規インデックス」はシートを開きます。「名前」、ドキュメントとして書く「キー」(1は昇順、-1は降順、テキストインデックスと地理空間インデックスにはtextと2dsphereも使えます)、そして3つのスイッチ:一意、スパース、「有効期限(TTL)」です。有効期限を付けると、「秒」はインデックスを張ったフィールドの日付からドキュメントが生きる時間になり、整数でなければなりません。そうでなければ「作成」は押せないままです。「作成」でサーバに送信します。サーバが拒否した場合(たとえば一意インデックスが重複した値を見つけたとき)、そのメッセージがシートに表示され、シートは開いたままです。

_idのインデックスはサーバが管理しているため削除できず、ボタンも表示されません。それ以外は、確認のあとゴミ箱のボタンで削除でき、それを使っていたクエリーはコレクション全体をスキャンするようになります。

環境タグがある場合
プロファイルのタグが読み出し専用なら、「新規インデックス」も各インデックスのゴミ箱のボタンも表示されません。一覧は引き続き読めます。書き込みを確認するタグなら、インデックスを作成する前にタグの名前を示して確認します。もともと確認を求める削除では、その質問にタグの名前が入り、二度は確認しません。

キーワード: MongoDB、インデックス、一意、TTL、テキスト、地理空間

サーバの状態、操作、ユーザ

リレーショナルの側でいうダッシュボード、プロセス、ユーザにあたるもの。

場所: ワークスペース › ツール › サーバ

MongoDBでは3つのサーバコマンドから得られる3つの情報を、セグメントコントロールの区画ごとに1つずつまとめています:「サーバ」(ホスト、バージョン、稼働時間、接続、メモリー、累積操作数)、「操作」(サーバがいま何をしているか)、「ユーザ」(ユーザとそのロール)です。自動では何も更新されません。各区画は開いたときに読み込まれ、「更新」で読み直します。

「操作」では、各行に操作の種類、その名前空間、実行中の秒数、発信元の接続が表示されます。「アイドルを含める」は、開いたまま何もしていない接続と、休んでいるサーバのスレッドを加えます。「操作を停止」はサーバに操作の終了を求めます。表示されるのはクライアントから来た操作だけです。Checkpointerのようなサーバ自身のスレッドにはボタンがありません。押しても止まらないからです。

「ユーザ」には、サーバ上のすべてのデータベースのすべてのユーザがuser@databaseの形で一覧表示されます。ユーザはデータベースの中に存在するのです。別のデータベースのロールには、そのロール自身の@が付きます。カスタムロールは特定のデータベースに属するので、一覧に出るのはほかのタブで選んだデータベースのもので、区画の見出しにそのデータベースの名前が入ります。

環境タグがある場合
プロファイルのタグが読み出し専用なら、どの操作にも「操作を停止」は表示されません。3つの区画は引き続き読めます。書き込みを確認するタグなら、操作を停止する前にタグの名前を示して確認します。

キーワード: MongoDB、サーバ、操作、ユーザ、ロール、currentOp

低速だった操作を確認

MongoDBのプロファイラ:各データベースのレベルと、記録した内容。

場所: ワークスペース › ツール › プロファイラ

プロファイラには3つのレベルがあります:オフ、しきい値を超えた操作だけ、そしてすべての操作です。しきい値の単位はミリ秒で(MySQLのように秒ではありません)、サンプリング率(0から1)は、低速な操作のうち記録される割合を表します。1未満では、サーバは低速な操作を意図的に捨てます。

レベルはサーバではなく、データベースごとに持つものです。そのため、ツールバーにはデータベースの選択があり、読み書きするものはすべて選んだデータベースが対象です。しかもレベルはメモリー上にあるだけで、サーバを再起動すると起動時の設定どおりに戻ります。

記録されたものはsystem.profileに入ります。これはデータベースごとの1 MBの上限付きコレクションで、履歴ではなく最新の操作を覗く窓です。そのドキュメントには_idがないので、読むだけで編集はできません。空にするとはコレクションを削除することで、それにはプロファイラをいったんオフにする必要があります:Calíopeはオフにし、削除し、元のレベルに戻します。

設定の下の一覧には、system.profileの中身が新しい順に表示されます:時刻、操作、名前空間、ミリ秒、そしてサーバが記録していれば、実行計画、検査したドキュメントとキー、返却したドキュメント、クライアントです。読み込むのは最新の200件だけで、フッターにそう表示されます。Macではダブルクリックかreturnキー、それ以外では行をタップすると、記録されたドキュメント全体が開きます。そこから、また行のメニューから、「JSONをコピー」でそれをコピーし、「コピーして『クエリー』を開く」でコマンドだけをコピーして「クエリー」を開きます。「自動更新(10秒)」は10秒ごとにすべてを読み直し、「読み込み」は最後に読んだ時刻を示し、「更新」はデータベースの一覧も読み直します。

「レベル」、「しきい値」、「サンプリング率」は「適用」を押すまで何も変えません。適用のあと、Calíopeはプロファイラを読み直します。サーバは新しい設定ではなく、変更前の設定を返すからです。

リレーショナルのスロークエリーログにあるような「SQL文ごと」の表示はありません。MongoDBは操作の形ごとの集計を公開しておらず、1 MBの窓の上でクライアント側で計算しても、データが裏付ける以上のことを主張することになります。

共有のAtlasやmongosの背後では、レベル1と2は設定できません。そこではサーバは0しか受け付けません。

環境タグがある場合
プロファイルのタグが読み出し専用なら、「このデータベースのプロファイラを変更」と「プロファイラを空にする」は表示されません。状態と記録された操作は残ります。書き込みを確認するタグなら、適用の前にタグの名前を示して確認します。もともと確認を求める空にする操作では、その質問にタグの名前が入り、二度は確認しません。

キーワード: MongoDB、プロファイラ、低速、slowms、system.profile、サンプリング率

サーバにコマンドを送る

インターフェイスが扱わないことのための出口。

場所: ワークスペース › ツール › コマンド

MongoDBではコマンドはドキュメントです。このツールはそれをそのまま送り、応答全体を表示します。

どのインターフェイスも扱わないことを引き受けます:コレクションの検証、統計情報の取得、クエリーの実行計画の表示、あらゆる管理コマンドです。エディタにドキュメントを入力し、「実行」(⌘↩)を押します。「例」メニューには、よく使うものがすぐ実行できる形で入っています。コレクションに作用するものには、その名前が入る場所にCOLLECTIONと書かれています。

ツールバーの先頭のメニューで送り先のデータベースを選びます。コマンドの中にはadminでしか受け付けられないものがあるからです。たとえば、サーバの起動時のオプションを表示するgetCmdLineOptsがそうです。

応答はツリーとして届き、サブドキュメントや配列の横の矢印で開けます。テキストが正しいJSONでなければ、Calíopeは何かを送る前にその場所を伝えます。サーバがコマンドを拒否した場合は、警告にそのコードと名前が入ります。書き込みは一部だけ受け入れられることもあります:バリデータが拒否したinsertでもok: 1と応答し、拒否されたドキュメントは、違反したルールとともにwriteErrorsの中に入って返ってきます。

環境タグがある場合
このツールは読み出し専用の接続でも表示されます。読むのに役立つからです。Calíopeは読むコマンドのリストを持っています(find、$outや$mergeを含まないaggregate、count、distinct、listCollections、listIndexes、listDatabases、dbStats、collStats、serverStatus、buildInfo、hello、isMaster、ping、explain、getLog、currentOp、connectionStatus、hostInfo、getParameter、getCmdLineOpts、validate、usersInfo、rolesInfo、getMore、killCursors)。それ以外はすべて書き込みとみなされ、知らないコマンドもそこに含まれます。タグが読み出し専用なら、書き込むコマンドは送られず、応答がその理由を伝えます。書き込みを確認するタグなら、送る前にタグの名前を示して確認します。

キーワード: MongoDB、コマンド、runCommand、検証、explain、統計情報

選んだコレクションはすべてのMongoDBツールに適用される

コレクションで選んだデータベースとコレクションを、クエリー、インデックス、そしてセッションのほかのMongoDBツールが使います。

場所: ワークスペース › ツール › コレクション

「コレクション」で選んだデータベースとコレクションは、タブではなくセッションに属します:「クエリー」、「インデックス」、そしてコレクションを扱うほかのMongoDBツールも同じものを使い、タブを切り替えても保たれます。

メニューでデータベースを変えるとコレクションは選択されていない状態になるので、別のデータベースのコレクションから何かを読むことはありません。セッションを開くと、プロファイルのデータベースがあらかじめ選ばれます。なければ、admin、config、local以外の最初のデータベースが選ばれます。

キーワード: コレクション、データベース、MongoDB、セッション、ツール

MongoDBのレポート:コレクション、find、aggregate

MongoDBのセッションでは、レポートはコレクションと形式(findによるフィルタか、aggregateによるパイプライン)を選び、どちらも拡張JSONで書きます。

場所: ワークスペース › ツール › レポート

MongoDBのセッションでは、新しいレポートはコレクションが空のfind(フィルタ)として始まります。テキストの上には「コレクション」と「形式」があります:前者は読むコレクションを、後者はfind(フィルタ)とaggregate(パイプライン)のどちらにするかを選びます。

どちらも拡張JSONで書きます。パイプラインは配列で、各ステージはオブジェクトでなければなりません。そうでなければ、レポートは実行の前に拒否されます。パラメータは"$$name"と書きます。形式を変えるとテキストは最初からになります:フィルタなら{}、パイプラインなら[]です。

MongoDBのレポートには「停止」も「スケジュール」もありません:途中で取り消すことはできず、スケジュールできるのはリレーショナルのレポートだけです。

キーワード: レポート、MongoDB、コレクション、find、aggregate、パイプライン、拡張JSON