Статьи

Используйте Mongosniff, чтобы уточнить, что ваш MongoDB слышит и говорит


Написание приложения поверх фреймворка поверх драйвера поверх базы данных немного похоже на игру на телефоне: вы говорите «вставьте foo», а в базе данных написано «посудомоечная машина с фиолетовыми обезьянами».
mongosniff позволяет вам точно видеть, что база данных слышит и говорит.

Он поставляется с бинарным дистрибутивом , поэтому если у вас есть mongod, вы должны иметь mongosniff .

Чтобы попробовать это, сначала запустите экземпляр mongod как обычно:

$ ./mongod

Когда вы запускаете mongosniff, вы должны указать ему слушать интерфейс loopback (localhost). Этот интерфейс обычно называется «lo», но мой Mac называет его «lo0», поэтому запустите ifconfig, чтобы убедиться, что вы правильно указали имя. Теперь запустите:

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

Обратите внимание на «sudo»: это никогда не работало для меня из моей учетной записи пользователя, возможно, из-за каких-то глупых сетевых разрешений.

Теперь запустите оболочку Монго и попробуйте вставить что-нибудь:

> 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 }

Здесь три запроса, все для одной жалкой вставки. Рассекая первый запрос, мы можем узнать:

источник — >>
пункт назначения

Наш клиент,
в данном случае
mongo , работает через порт 57856 и отправил сообщение в базу данных (127.0.0.1:27017).
дб .
коллекция

Этот запрос предназначен для коллекции «foo» базы данных «test».
длина байтов

Длина запроса составляет 62 байта.
Это может быть удобно, если ваши запросы приближаются к максимальной длине запроса (16 МБ).

id:
шестнадцатеричный
идентификатор

Это идентификатор запроса в шестнадцатеричном и десятичном виде (в случае, если у вас нет компьютера, очевидно).
Каждый запрос к базе данных имеет уникальный идентификатор, связанный с ним для целей налогообложения.
op :
content

Это фактическое содержание запроса: мы вставляем этот документ.
Обратите внимание, что он вставляет значение с плавающей запятой 1.0, хотя мы ввели 1 в оболочке. Это связано с тем, что JavaScript имеет только один тип чисел, поэтому каждое число, введенное в оболочке, преобразуется в двойной.

Следующий запрос в выводе mongosniff — это команда базы данных: она проверяет, что вставка прошла успешно (оболочка всегда выполняет безопасные вставки ).

Последнее прослушанное сообщение немного отличается: оно идет из базы данных в оболочку. Это ответ базы данных на команду getlasterror. Он показывает, что был возвращен только один документ (ответ n: 1) и что в базе данных больше нет результатов, ожидающих (cursorId: 0). Если бы это был «реальный» запрос и был другой пакет результатов для отправки из базы данных, cursorId был бы ненулевым.

Надеюсь, это поможет некоторым людям понять, что, черт возьми, происходит!