sql >> Base de Datos >  >> NoSQL >> MongoDB

Use Mongosniff para aclarar lo que su MongoDB escucha y dice

Escribir una aplicación sobre el marco sobre el controlador sobre la base de datos es un poco como un juego en el teléfono:dices "insertar foo" y la base de datos dice "lavavajillas con monos morados".
Mongosniff le permite ver exactamente lo que escucha y dice la base de datos.
Viene con una distribución binaria, así que si tienes un mongod, deberías tener mongosniff.

Para probar esto, primero, ejecute la instancia de mongod como de costumbre:

$ ./mongod

Cuando ejecuta mongosniff, debe indicarle que escuche la interfaz de bucle invertido (localhost). Esta interfaz generalmente se llama "lo", pero mi Mac la llama "lo0", así que ejecute ifconfig para asegurarse de darle el nombre correcto. Ahora ejecútalo:

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

Nota "sudo":esto nunca funcionó para mí desde mi cuenta de usuario, probablemente debido a algunos permisos de red estúpidos.

Ahora ejecute el shell de Mongo e intente insertar algo:

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

Si observa la salida de mongosniff, verá:

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 }

Hay tres solicitudes, todas para una miserable inserción. Al cortar la primera solicitud, podemos averiguar:

fuente –>>
lugar de destino

Nuestro cliente,
En este caso, mongo, trabaja a través del puerto 57856 y envió un mensaje a la base de datos (127.0.0.1:27017).
dB
colección

Esta consulta es para la colección "foo" de la base de datos "test".
Longitud en bytes

La longitud de la solicitud es de 62 bytes. Esto puede ser conveniente si sus solicitudes están cerca de la longitud máxima de solicitud (16 MB).

id:
hexadecimal
identificador

Este es el ID de la solicitud en forma hexadecimal y decimal (en caso de que no tengas una computadora, obviamente). Cada consulta a la base de datos tiene asociado un identificador único a efectos fiscales.
op:
contenido .

Este es el contenido real de la solicitud:insertamos este documento. Tenga en cuenta que inserta un valor de punto flotante de 1,0 aunque hemos ingresado 1 en el shell. Esto se debe a que JavaScript solo tiene un tipo de número, por lo que cada número ingresado en el shell se convierte en un doble.
La próxima solicitud en la salida de mongosniff es el comando de la base de datos:verifica que la inserción sea exitosa (el shell siempre realiza inserciones seguras).

El último mensaje escuchado es ligeramente diferente:va de la base de datos al shell. Esta es la respuesta de la base de datos al comando getlasterror. Muestra que solo se devolvió un documento (respuesta n:1) y que no hay más resultados esperando en la base de datos (cursorId:0). Si se tratara de una consulta "real" y hubiera otro paquete de resultados para enviar desde la base de datos, cursorId no sería cero.

MongoDB en 30 minutos