MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Utilisez Mongosniff pour clarifier ce que votre MongoDB entend et dit

​​

Écrire une application au-dessus du framework au-dessus du pilote au-dessus de la base de données est un peu comme un jeu sur le téléphone :vous dites "insérer foo", et la base de données dit "lave-vaisselle avec des singes violets".
Mongosniff vous permet de voir exactement ce que la base de données entend et dit.
Il est livré avec une distribution binaire, donc si vous avez un mongod, vous devriez avoir mongosniff .

Pour essayer cela, commencez par exécuter l'instance mongod comme d'habitude :

$ ./mongod

Lorsque vous exécutez mongosniff, vous devez lui indiquer d'écouter l'interface de bouclage (localhost). Cette interface est généralement appelée "lo", mais mon Mac l'appelle "lo0", alors exécutez ifconfig pour vous assurer de lui donner le bon nom. Maintenant lancez-le :

$ sudo ./mongosniff --source NET lo
sniffing... 27017

Remarque "sudo":cela n'a jamais fonctionné pour moi depuis mon compte d'utilisateur, probablement à cause de certaines autorisations réseau stupides.

Lancez maintenant le shell Mongo et essayez d'insérer quelque chose :

db.foo.insert({x:1})

Si vous regardez la sortie de mongosniff, vous verrez :

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 }

Il y a trois demandes, toutes pour un misérable encart. En coupant la première requête, on peut savoir :

source –>>
lieu de destination

Notre client,
Dans ce cas, mongo , fonctionne via le port 57856 et a envoyé un message à la base de données (127.0.0.1:27017).
dB
collecte

Cette requête concerne la collection "foo" de la base de données "test".
Longueur en octets

La longueur de la requête est de 62 octets. Cela peut être pratique si vos requêtes sont proches de la longueur maximale des requêtes (16 Mo).

identifiant :
hexadécimal
identifiant

Il s'agit de l'identifiant de la requête sous forme hexadécimale et décimale (au cas où vous n'auriez pas d'ordinateur, évidemment). Chaque requête adressée à la base de données est associée à un identifiant unique à des fins fiscales.
op :
contenu .

C'est le contenu réel de la demande :nous insérons ce document. Notez qu'il insère une valeur à virgule flottante de 1,0 bien que nous ayons entré 1 dans le shell. C'est parce que JavaScript n'a qu'un seul type de nombre, donc chaque nombre entré dans le shell est converti en un double.
La requête suivante dans la sortie de mongosniff est la commande de la base de données :elle vérifie que l'insertion a réussi (le shell effectue toujours des insertions sécurisées).

Le dernier message entendu est légèrement différent :il va de la base de données au shell. Il s'agit de la réponse de la base de données à la commande getlasterror. Il montre qu'un seul document a été retourné (réponse n :1) et qu'il n'y a plus de résultats en attente dans la base de données (cursorId :0). S'il s'agissait d'une "vraie" requête et qu'il y avait un autre ensemble de résultats à envoyer à partir de la base de données, le curseurId serait différent de zéro.

MongoDB en 30 minutes