MongoDB を使用するアプリケーションを開発していると、デバッグやチューニングのために、実行したクエリーや遅いクエリーなどを取得したいことがある。そこで、本書では、Windows サービスで動作している MongoDB が実行したクエリーを出力する方法を記載する。動作確認は、MongoDB 3.0.x で実施。
目次
(1) クエリー出力設定
(1-1) MongoDB のサービス名を取得する。
オプションの設定に使用するサービス名を取得します。
- 「サービス」一覧ダイアログを起動する。
- MongoDB のサービスノードをダブルクリックし、「サービス名」を確認する。(※サービス名は、アプリケーションによって異なる。)
(1-2) MongoDB にオプションを設定する。
クエリーを出力するために、オプションを設定する。
- スタートメニューから「ファイル名を指定して実行」をクリックし、「regedit」と入力し、Enter 。
- 「レジストリ エディタ」を開き、以下のパスへ移動。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\サービス名 - 画面右の「ImagePath」をダブルクリックする。
- 「値のデータ」に表示されている内容の末尾に以下を追記する。
–profile=1 –slowms=-1 - サービスを再起動する。
ちなみに、
1 2 3 4 5 6 |
// すべてのクエリーを出力する --profile=1 --slowms=-1 // 2ms 以上のスロークエリーを出力する --profile=1 --slowms=2 // 一切のクエリーを出力しない --profile=0 |
(2) ログの保存先
以下のコレクション、または log ファイル(mongodb\data\log\1.log)に出力されている。
1 2 3 |
> use apple > show collections system.profile <--- このコレクションに入っている |
(3) ログの確認
(3-1) 最新のログを確認する
1 |
> db.system.profile.find().sort({ts: -1}).limit(1).forEach(printjson) |
(3-2) 最も遅いログを確認する
1 |
> db.system.profile.find().sort({millis: -1}).limit(1).forEach(printjson) |
(4) ログからクエリーの生成
例えば、
1 2 3 4 5 6 7 8 9 |
"ns" : "apple.unit", "query" : { "$query" : { "pc mac address" : "12:34:56:78:90:ab" }, "$orderby" : { "_id" : -1 } } |
ならば、
1 2 |
> use apple > db.unit.find({"pc mac address" : "12:34:56:78:90:ab"}).sort({"_id" : -1}) |
以上