mon go shell - отображать необработанные команды, отправленные на сервер? - PullRequest
0 голосов
/ 28 января 2020

Я предполагаю, что все команды, которые пользователь вводит в оболочку mon go, преобразуются в строку JSON перед отправкой на сервер mongodb для обработки.

Например, если я отправляю после JSON на сервер mongodb сервер вернет документ, где companyId равен "12345" , вот что JSON:

{"companyId": "12345"}

Есть ли способ, чтобы оболочка mon go отображала фактическую команду, отправляемую на сервер для обработки?

PS На всякий случай, если вам интересно мое предположение выше, я использование драйвера mon go -cxx для отправки команд на сервер mongodb. Все команды отформатированы и отправлены на сервер mongodb как JSON объекты.

1 Ответ

1 голос
/ 29 января 2020

Я предполагаю, что все команды, которые пользователь вводит в оболочку mon go, преобразуются в строку JSON перед отправкой на сервер mongodb для обработки.

Ваш неверно предположение о необработанных командах, которые отправляются на сервер для обработки: проводной протокол MongoDB и хранилище на стороне сервера используют BSON (двоичный JSON -подобный формат сериализации ). JSON - это удобный способ думать о модели данных (и работать с данными для потребления и создания человеком), но BSON - это расширенный набор типов данных и поведения JSON.

Например, BSON упорядоченная структура двоичных данных (не словарь), которая не требует, чтобы имена полей были уникальными. BSON также поддерживает дополнительные типы данных , такие как двоичные данные, 32-разрядные и 64-разрядные целые числа, числа с плавающей запятой и десятичные числа (MongoDB 3.4+). Драйверы MongoDB позаботятся о сериализации данных между различными представлениями для удобства (например, специфика языка c, структуры данных JSON или BSON), но если вы думаете о MongoDB как о «базе данных BSON», это может быть полезно для определения некоторой производительности улучшения в вашем подходе или объяснение некоторого иного неочевидного поведения, такого как упорядочение ключей.

Если вы действительно хотите увидеть необработанный диалог, которым обмениваются при развертывании MongoDB, вы можете использовать инструмент проверки сетевых пакетов, такой как Wireshark , который понимает проводной протокол MongoDB. Тем не менее, это вряд ли будет полезно, если вы не пытаетесь разработать новый драйвер или отладить проблему с сервером / драйвером очень низкого уровня.

Если вас больше интересует регистрация запросов или команд MongoDB, полученных сервером Вы можете настроить уровень журнала сервера , чтобы включить соответствующие подробности (предостережение: дополнительные подробности отладки могут быть просто бесподобными) или рассмотреть возможность использования MongoDB profiler . Увеличенные уровни ведения журнала или профилирования следует использовать с осторожностью в загруженной производственной среде, поскольку они могут добавить значительные затраты на ввод-вывод и хранение.

Есть ли способ получить оболочку mon go отобразить фактическую команду, отправленную на сервер для обработки?

Нет встроенной опции для отображения команд, отправленных на сервер, но, возможно, вы можете добавить больше отладки настраивая оболочку mongo с помощью JavaScript.

Большинство общих помощников оболочки mongo реализованы в виде JavaScript функций, которые преобразуют предоставленные аргументы в структуру данных, которую можно передать команда базы данных , например, find или aggregate через db.runCommand(). Данные в оболочке mongo преобразуются из JavaScript в BSON для отправки в развертывание MongoDB, а ответ сервера затем преобразуется из BSON в JavaScript для интерпретации в оболочке. Преобразование между BSON и JavaScript осуществляется родными методами C ++, которые являются частью 1044 * исходного кода оболочки .

Если вы хотите увидеть, как реализуется оболочка mongo Специфический помощник c для создания команды, такой как db.collection.insertOne(), попробуйте выполнить команду без скобок: db.collection.insertOne. Большая часть вспомогательной логики оболочки c будет посвящена проверке параметров и возвращению объекта результата, но в какой-то момент фактическое взаимодействие с сервером будет делегировано нативному методу C ++, который будет отображаться как [native code], если вы попытаетесь оценить функцию в оболочка mongo без скобок.

Я использую драйвер mon go -cxx для отправки команд на сервер mongodb

По умолчанию драйвер C ++ работает непосредственно со структурами данных BSON и позволяет избежать ненужной сериализации в JSON с использованием интерфейсов построителя документов . Однако JSON - более удобный (но менее производительный) вариант, если вы хотите вручную создавать или просматривать данные.

Для получения дополнительной информации о BSON против JSON, вас также может заинтересовать мой ответ Почему MongoDB проверяет порядок ключей при сопоставлении встроенных документов? в программном обеспечении разработки Exchange.

...