sql >> データベース >  >> NoSQL >> MongoDB

Mongosniffを使用して、MongoDBが聞いて言うことを明確にします

    データベースの上にあるドライバーの上にあるフレームワークの上にアプリケーションを作成することは、電話でのゲームに少し似ています。「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はゼロ以外になります。

    MongoDBを30分で


    1. Redisクラスターフェイルオーバー:スレーブはマスターになりません

    2. MongoDB書き込みの懸念:3つの知っておくべき警告

    3. MongoDBPHPUTF-8の問題

    4. 新しいmongodbPECL拡張機能ではソートはどのように機能しますか?