Написание приложения поверх фреймворка поверх драйвера поверх базы данных немного похоже на игру на телефоне: вы говорите «вставьте 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 был бы ненулевым.
Надеюсь, это поможет некоторым людям понять, что, черт возьми, происходит!