データベースの上にあるドライバーの上にあるフレームワークの上にアプリケーションを作成することは、電話でのゲームに少し似ています。「fooを挿入」と言うと、データベースには「紫の猿の食器洗い機」と書かれます。
Mongosniffを使用すると、データベースが何を聞いて何を言っているかを正確に確認できます。
バイナリディストリビューションが付属しているため、mongodを使用している場合は、mongosniffを使用する必要があります。
これを試すには、まず、通常どおりmongodインスタンスを実行します。
$ ./mongod
mongosniffを実行するときは、ループバックインターフェイス(localhost)をリッスンするように指示する必要があります。このインターフェイスは通常「lo」と呼ばれますが、私のMacでは「lo0」と呼ばれているため、ifconfigを実行して、正しい名前を付けていることを確認してください。今すぐ実行します:
$ sudo ./mongosniff --source NET lo
sniffing... 27017
「sudo」に注意してください。これは、おそらくいくつかの愚かなネットワーク権限のために、私のユーザーアカウントからは機能しませんでした。
次に、Mongoシェルを実行して、何かを挿入してみます。
db.foo.insert({x:1})
mongosniffの出力を見ると、次のように表示されます。
127.0.0.1:57856 -->> 127.0.0.1:27017 test.foo 62 bytes id:430131ca 1124151754
insert: { _id: ObjectId('4c7fb007b5d697849addc650'), x: 1.0 }
127.0.0.1:57856 -->> 127.0.0.1:27017 test.$cmd 76 bytes id:430131cb 1124151755
query: { getlasterror: 1.0, w: 1.0 } ntoreturn: -1 ntoskip: 0
127.0.0.1:27017 <<-- 127.0.0.1:57856 76 bytes id:474447bf 1195657151 - 1124151755
reply n:1 cursorId: 0
{ err: null, n: 0, wtime: 0, ok: 1.0 }
3つのリクエストがあり、すべて1つの惨めな挿入に対するものです。最初のリクエストをカットすることで、次のことがわかります。
ソース–>>
目的地
当社のクライアント、
この場合、mongoはポート57856を介して機能し、データベース(127.0.0.1:27017)にメッセージを送信します。
dB
コレクション
このクエリは、「テスト」データベースの「foo」コレクションに対するものです。
バイト長
要求の長さは62バイトです。これは、リクエストが最大リクエスト長(16 MB)に近い場合に便利です。
id:
16進数
識別子
これは、16進数および10進数の形式の要求IDです(コンピューターがない場合は、明らかに)。データベースへの各クエリには、税務上の目的で関連付けられた一意の識別子があります。
op:
コンテンツ。
これがリクエストの実際の内容です。このドキュメントを挿入します。 シェルに1を入力しましたが、浮動小数点値1.0が挿入されることに注意してください。 これは、JavaScriptには数値タイプが1つしかないため、シェルに入力された各数値がdoubleに変換されるためです。
mongosniffの出力の次のリクエスト データベースコマンドです。挿入が成功したことを確認します(シェルは常に安全な挿入を実行します)。
最後に聞こえるメッセージは少し異なります。データベースからシェルに送られます。 これは、getlasterrorコマンドに対するデータベースの応答です。これは、1つのドキュメントのみが返されたこと(回答n:1)と、データベースで待機している結果がこれ以上ないこと(cursorId:0)を示しています。これが「実際の」クエリであり、データベースから送信する結果の別のパッケージがあった場合、cursorIdはゼロ以外になります。