Psaní aplikace nad rámec nad ovladačem nad databází je trochu jako hra na telefonu:řeknete „vložte foo“ a databáze říká „myčka s fialovými opicemi“.
Mongosniff vám umožňuje přesně vidět, co databáze slyší a říká.
Dodává se s binární distribucí, takže pokud máte mongoda, měli byste mít mongosniff .
Chcete-li to vyzkoušet, nejprve spusťte instanci mongoda jako obvykle:
$ ./mongod
Když spustíte mongosniff, musíte mu říct, aby naslouchal rozhraní zpětné smyčky (localhost). Toto rozhraní se obvykle nazývá „lo“, ale můj Mac mu říká „lo0“, takže spusťte ifconfig, abyste se ujistili, že mu dáváte správný název. Nyní to spusťte:
$ sudo ./mongosniff --source NET lo
sniffing... 27017
Poznámka „sudo“:toto mi nikdy nefungovalo z mého uživatelského účtu, pravděpodobně kvůli nějakým hloupým síťovým oprávněním.
Nyní spusťte Mongo shell a zkuste něco vložit:
db.foo.insert({x:1})
Když se podíváte na výstup mongosniffu, uvidíte:
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 }
Jsou tam tři požadavky, všechny na jednu mizernou vložku. Rozřezáním prvního požadavku můžeme zjistit:
zdroj –>>
místo určení
Náš klient,
V tomto případě mongo funguje přes port 57856 a odeslal zprávu do databáze (127.0.0.1:27017).
dB
sbírka
Tento dotaz je pro kolekci „foo“ databáze „test“.
Bajtová délka
Délka požadavku je 62 bajtů. To může být výhodné, pokud se vaše požadavky blíží maximální délce požadavku (16 MB).
id:
hexadecimální
identifikátor
Toto je ID požadavku v hexadecimální a desítkové podobě (v případě, že nemáte počítač, samozřejmě). Každý dotaz do databáze má pro daňové účely přiřazený jedinečný identifikátor.
op :
obsah .
Toto je skutečný obsah žádosti:vkládáme tento dokument. Všimněte si, že vloží hodnotu s plovoucí desetinnou čárkou 1,0, i když jsme do shellu zadali 1. Je to proto, že JavaScript má pouze jeden typ čísla, takže každé číslo zadané do shellu je převedeno na dvojité.
Další požadavek ve výstupu mongosniff je databázový příkaz:kontroluje, zda bylo vložení úspěšné (shell vždy provede bezpečné vložení).
Poslední slyšená zpráva je mírně odlišná:jde z databáze do shellu. Toto je odpověď databáze na příkaz getlasterror. Ukazuje, že byl vrácen pouze jeden dokument (odpověď n:1) a že v databázi již nečekají žádné výsledky (cursorId:0). Pokud by se jednalo o „skutečný“ dotaz a z databáze měl být odeslán další balík výsledků, kurzorId by bylo nenulové.