Как создать базу данных MongoDB: 6 важных аспектов, которые нужно знать

Опубликовано: 2022-11-07

В зависимости от ваших требований к программному обеспечению вы можете отдать предпочтение гибкости, масштабируемости, производительности или скорости. Следовательно, разработчики и предприятия часто путаются при выборе базы данных для своих нужд. Если вам нужна база данных, которая обеспечивает высокую гибкость и масштабируемость, а также агрегацию данных для клиентской аналитики, вам может подойти MongoDB!
Узнайте больше о структуре базы данных MongoDB и о том, как создавать базу данных, отслеживать ее и управлять ею, из этого полезного руководства Click to Tweet
В этой статье мы обсудим структуру базы данных MongoDB и способы создания, мониторинга и управления вашей базой данных! Давайте начнем.

Как устроена база данных MongoDB?

MongoDB — это база данных NoSQL без схемы. Это означает, что вы не указываете структуру для таблиц/баз данных, как для баз данных SQL.

Знаете ли вы, что базы данных NoSQL на самом деле быстрее, чем реляционные базы данных? Это связано с такими характеристиками, как индексирование, сегментирование и конвейеры агрегации. MongoDB также известен своим быстрым выполнением запросов. Вот почему его предпочитают такие компании, как Google, Toyota и Forbes.

Ниже мы рассмотрим некоторые ключевые характеристики MongoDB.

Документы

MongoDB имеет модель данных документа, которая хранит данные в виде документов JSON. Документы естественным образом сопоставляются с объектами в коде приложения, что упрощает их использование разработчиками.

В таблицу реляционной базы данных необходимо добавить столбец, чтобы добавить новое поле. Это не относится к полям в документе JSON. Поля в документе JSON могут отличаться от документа к документу, поэтому они не будут добавляться к каждой записи в базе данных.

Документы могут хранить структуры, такие как массивы, которые могут быть вложены для выражения иерархических отношений. Кроме того, MongoDB преобразует документы в двоичный тип JSON (BSON). Это обеспечивает более быстрый доступ и улучшенную поддержку различных типов данных, таких как строка, целое число, логическое число и многое другое!

Наборы реплик

Когда вы создаете новую базу данных в MongoDB, система автоматически создает как минимум еще 2 копии ваших данных. Эти копии известны как «наборы реплик», и они постоянно реплицируют данные между собой, обеспечивая улучшенную доступность ваших данных. Они также обеспечивают защиту от простоев во время системного сбоя или планового обслуживания.

Коллекции

Коллекция — это группа документов, связанных с одной базой данных. Они похожи на таблицы в реляционных базах данных.

Коллекции, однако, гораздо более гибкие. Во-первых, они не полагаются на схему. Во-вторых, документы не обязательно должны быть одного типа данных!

Чтобы просмотреть список коллекций, принадлежащих базе данных, используйте команду listCollections .

Конвейеры агрегации

Вы можете использовать эту структуру для объединения нескольких операторов и выражений. Он гибкий, поскольку позволяет обрабатывать, преобразовывать и анализировать данные любой структуры.

Благодаря этому MongoDB обеспечивает быстрые потоки данных и функции для 150 операторов и выражений. Он также имеет несколько этапов, таких как этап Union, который гибко объединяет результаты из нескольких коллекций.

Индексы

Вы можете индексировать любое поле в документе MongoDB, чтобы повысить его эффективность и скорость запросов. Индексирование экономит время за счет сканирования индекса для ограничения проверяемых документов. Разве это не лучше, чем читать каждый документ в коллекции?

Вы можете использовать различные стратегии индексирования, в том числе составные индексы для нескольких полей. Например, у вас есть несколько документов, содержащих имя и фамилию сотрудника в отдельных полях. Если вы хотите, чтобы возвращались имя и фамилия, вы можете создать индекс, включающий как «Фамилию», так и «Имя». Это было бы намного лучше, чем иметь один индекс для «Фамилии», а другой для «Имени».

Вы можете использовать такие инструменты, как Performance Advisor, чтобы лучше понять, какой запрос может выиграть от индексов.

Разделение

Разделение распределяет один набор данных по нескольким базам данных. Затем этот набор данных можно хранить на нескольких машинах, чтобы увеличить общую емкость системы. Это связано с тем, что он разбивает большие наборы данных на более мелкие фрагменты и сохраняет их в различных узлах данных.

MongoDB разбивает данные на уровне коллекции, распределяя документы в коллекции по сегментам в кластере. Это обеспечивает масштабируемость, позволяя архитектуре обрабатывать самые большие приложения.

Как создать базу данных MongoDB

Сначала вам нужно установить правильный пакет MongoDB, подходящий для вашей ОС. Перейдите на страницу «Загрузить сервер сообщества MongoDB». Из доступных вариантов выберите последнюю «версию», формат «пакета» в виде zip-файла и «платформу» в качестве вашей ОС и нажмите «Загрузить», как показано ниже:

На этом изображении показаны доступные параметры: версия, платформа и пакет при загрузке MongoDB Community Server.
Процесс загрузки сервера сообщества MongoDB. (Источник изображения: сервер сообщества MongoDB)

Процесс довольно прост, так что MongoDB будет установлена ​​в вашей системе в кратчайшие сроки!

После завершения установки откройте командную строку и введите mongod -version , чтобы проверить ее. Если вы не получаете следующий вывод, а вместо этого видите строку ошибок, возможно, вам придется переустановить его:

Это фрагмент кода для проверки версии MongoDB после установки.
Проверка версии MongoDB. (Источник изображения: configserverfirewall)

Использование оболочки MongoDB

Прежде чем мы начнем, убедитесь, что:

  • Ваш клиент защищен на транспортном уровне и находится в вашем списке разрешенных IP-адресов.
  • У вас есть учетная запись пользователя и пароль в нужном кластере MongoDB.
  • Вы установили MongoDB на свое устройство.

Шаг 1: доступ к оболочке MongoDB

Чтобы получить доступ к оболочке MongoDB, введите следующую команду:

 net start MongoDB

Это должно дать следующий результат:

Это фрагмент кода для инициализации сервера MongoDB.
Инициализация сервера MongoDB. (Источник изображения: c-sharpcorner)

Предыдущая команда инициализировала сервер MongoDB. Чтобы запустить его, нам нужно ввести mongo в командной строке.

Это фрагмент кода для запуска сервера MongoDB.
Запуск сервера MongoDB. (Источник изображения: bmc)

Здесь, в оболочке MongoDB, мы можем выполнять команды для создания баз данных, вставки данных, редактирования данных, выполнения административных команд и удаления данных.

Шаг 2: Создайте свою базу данных

В отличие от SQL, в MongoDB нет команды создания базы данных. Вместо этого есть ключевое слово use , которое переключается на указанную базу данных. Если база данных не существует, она создаст новую базу данных, в противном случае она будет связана с существующей базой данных.

Например, чтобы инициировать базу данных под названием «компания», введите:

 use Company
Это фрагмент кода для создания базы данных в MongoDB.
Создание базы данных в MongoDB.

Вы можете ввести db , чтобы подтвердить базу данных, которую вы только что создали в своей системе. Если появится новая созданная вами база данных, вы успешно к ней подключились.

Если вы хотите проверить существующие базы данных, введите show dbs , и он вернет все базы данных в вашей системе:

Это фрагмент кода для просмотра существующих баз данных в системе.
Просмотр баз данных в MongoDB.

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

Вы заметили, что созданная нами база данных не отображается? Это потому, что мы еще не сохранили значения в базе данных! Мы будем обсуждать вставку в разделе управления базой данных.

Использование пользовательского интерфейса Атласа

Вы также можете начать работу со службой базы данных MongoDB, Atlas. Хотя вам может потребоваться заплатить за доступ к некоторым функциям Atlas, большинство функций базы данных доступны на бесплатном уровне. Возможностей бесплатного уровня более чем достаточно для создания базы данных MongoDB.

Прежде чем мы начнем, убедитесь, что:

  1. Ваш IP в белом списке.
  2. У вас есть учетная запись пользователя и пароль в кластере MongoDB, который вы хотите использовать.

Чтобы создать базу данных MongoDB с помощью AtlasUI, откройте окно браузера и войдите на https://cloud.mongodb.com. На странице вашего кластера щелкните Обзор коллекций . Если в кластере нет баз данных, вы можете создать свою базу данных, нажав кнопку « Добавить мои собственные данные ».

В приглашении вам будет предложено указать имя базы данных и коллекции. После того, как вы назвали их, нажмите «Создать », и все готово! Теперь вы можете вводить новые документы или подключаться к базе данных с помощью драйверов.

Управление вашей базой данных MongoDB

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

Использование коллекций

В то время как реляционные базы данных имеют четко определенные таблицы с определенными типами данных и столбцами, NoSQL использует коллекции вместо таблиц. Эти коллекции не имеют какой-либо структуры, а документы могут различаться — вы можете иметь разные типы данных и поля без необходимости сопоставлять формат другого документа в той же коллекции.

Для демонстрации создадим коллекцию «Сотрудник» и добавим в нее документ:

 db.Employee.insert( { "Employeename" : "Chris", "EmployeeDepartment" : "Sales" } )

Если вставка прошла успешно, он вернет WriteResult({ "nInserted" : 1 }) :

Этот фрагмент кода возвращает WriteResult({
Успешная вставка в MongoDB.

Здесь «db» относится к текущей подключенной базе данных. «Сотрудник» — это вновь созданная коллекция в базе данных компании.

Мы не задали здесь первичный ключ, потому что MongoDB автоматически создает поле первичного ключа с именем «_id» и устанавливает для него значение по умолчанию.

Выполните приведенную ниже команду, чтобы проверить коллекцию в формате JSON:

 db.Employee.find().forEach(printjson)

Выход:

 { "_id" : ObjectId("63151427a4dd187757d135b8"), "Employeename" : "Chris", "EmployeeDepartment" : "Sales" }

Хотя значение «_id» назначается автоматически, вы можете изменить значение первичного ключа по умолчанию. На этот раз мы вставим другой документ в базу данных «Сотрудник» со значением «_id» равным «1»:

 db.Employee.insert( { "_id" : 1, "EmployeeName" : "Ava", "EmployeeDepartment" : "Public Relations" } )

При запуске команды db.Employee.find().forEach(printjson) мы получаем следующий вывод:

Вывод показывает документы в коллекции Employee вместе с их первичным ключом.
Документы в коллекции с их первичным ключом.

В приведенном выше выводе значение «_id» для «Ava» установлено равным «1» вместо автоматического присвоения значения.

Теперь, когда мы успешно добавили значения в базу данных, мы можем проверить, отображаются ли они в существующих базах данных в нашей системе, используя следующую команду:

 show dbs
Вывод показывает коллекцию сотрудников в существующих базах данных в нашей системе.
Отображение списка баз данных.

И вуаля! Вы успешно создали базу данных в своей системе!

Использование компаса MongoDB

Хотя мы можем работать с серверами MongoDB из оболочки Mongo, иногда это может быть утомительно. Вы можете столкнуться с этим в производственной среде.

Однако существует инструмент компаса (с соответствующим названием Compass), созданный MongoDB, который может упростить эту задачу. Он имеет улучшенный графический интерфейс и дополнительные функции, такие как визуализация данных, профилирование производительности и доступ CRUD (создание, чтение, обновление, удаление) к данным, базам данных и коллекциям.

Вы можете загрузить Compass IDE для своей ОС и установить ее с помощью простого процесса.

Затем откройте приложение и создайте соединение с сервером, вставив строку подключения. Если вы не можете найти его, вы можете нажать Заполнить поля подключения по отдельности . Если вы не изменили номер порта при установке MongoDB, просто нажмите кнопку подключения, и все готово! В противном случае просто введите значения, которые вы установили, и нажмите « Подключиться ».

На этом изображении показано окно «Новое подключение», в которое можно вставить URL-адрес подключения.
Новое окно подключения в MongoDB.. (Источник изображения: mongodb)

Затем укажите имя хоста, порт и аутентификацию в окне «Новое подключение».

В MongoDB Compass вы можете одновременно создать базу данных и добавить ее первую коллекцию. Вот как это сделать:

  1. Нажмите « Создать базу данных» , чтобы открыть приглашение.
  2. Введите имя базы данных и ее первую коллекцию.
  3. Щелкните Создать базу данных .

Вы можете вставить дополнительные документы в свою базу данных, щелкнув имя своей базы данных, а затем щелкнув имя коллекции, чтобы увидеть вкладку « Документы ». Затем вы можете нажать кнопку « Добавить данные », чтобы вставить один или несколько документов в свою коллекцию.

Добавляя свои документы, вы можете вводить их по одному или как несколько документов в массиве. Если вы добавляете несколько документов, убедитесь, что эти документы, разделенные запятыми, заключены в квадратные скобки. Например:

 { _id: 1, item: { name: "apple", code: "123" }, qty: 15, tags: [ "A", "B", "C" ] }, { _id: 2, item: { name: "banana", code: "123" }, qty: 20, tags: [ "B" ] }, { _id: 3, item: { name: "spinach", code: "456" }, qty: 25, tags: [ "A", "B" ] }, { _id: 4, item: { name: "lentils", code: "456" }, qty: 30, tags: [ "B", "A" ] }, { _id: 5, item: { name: "pears", code: "000" }, qty: 20, tags: [ [ "A", "B" ], "C" ] }, { _id: 6, item: { name: "strawberry", code: "123" }, tags: [ "B" ] }

Наконец, нажмите « Вставить », чтобы добавить документы в свою коллекцию. Вот как будет выглядеть тело документа:

 { "StudentID" : 1 "StudentName" : "JohnDoe" }

Здесь названия полей — «StudentID» и «StudentName». Значения поля — «1» и «JohnDoe» соответственно.

Полезные команды

Вы можете управлять этими коллекциями с помощью команд управления ролями и управления пользователями.

Команды управления пользователями

Команды управления пользователями MongoDB содержат команды, относящиеся к пользователю. Мы можем создавать, обновлять и удалять пользователей с помощью этих команд.

dropUser

Эта команда удаляет одного пользователя из указанной базы данных. Ниже приведен синтаксис:

 db.dropUser(username, writeConcern)

Здесь username является обязательным полем, которое содержит документ с аутентификацией и информацией о доступе пользователя. Необязательное поле writeConcern содержит уровень беспокойства о записи для операции создания. Уровень беспокойства о записи можно определить с помощью необязательного поля writeConcern .

Перед удалением пользователя с ролью userAdminAnyDatabase убедитесь, что есть хотя бы один другой пользователь с правами администратора пользователей.

В этом примере мы добавим пользователя «user26» в тестовую базу данных:

 use test db.dropUser("user26", {w: "majority", wtimeout: 4000})

Выход:

 > db.dropUser("user26", {w: "majority", wtimeout: 4000}); true
Создать пользователя

Эта команда создает нового пользователя для указанной базы данных следующим образом:

 db.createUser(user, writeConcern)

Здесь user — это обязательное поле, содержащее документ с аутентификацией и информацией о доступе для создаваемого пользователя. Необязательное поле writeConcern содержит уровень беспокойства о записи для операции создания. Уровень беспокойства о записи можно определить с помощью необязательного поля writeConcern .

createUser вернет ошибку повторяющегося пользователя, если пользователь уже существует в базе данных.

Вы можете создать нового пользователя в тестовой базе данных следующим образом:

 use test db.createUser( { user: "user26", pwd: "myuser123", roles: [ "readWrite" ] } );

Результат выглядит следующим образом:

 Successfully added user: { "user" : "user26", "roles" : [ "readWrite", "dbAdmin" ] }
грантролестоусер

Вы можете использовать эту команду, чтобы предоставить пользователю дополнительные роли. Чтобы использовать его, вам нужно помнить следующий синтаксис:

 db.runCommand( { grantRolesToUser: "<user>", roles: [ <roles> ], writeConcern: { <write concern> }, comment: <any> } )

В упомянутых выше ролях можно указать как пользовательские, так и встроенные роли. Если вы хотите указать роль, существующую в той же базе данных, где работает grantRolesToUser , вы можете либо указать роль с документом, как указано ниже:

 { role: "<role>", db: "<database>" }

Или вы можете просто указать роль с именем роли. Например:

 "readWrite"

Если вы хотите указать роль, присутствующую в другой базе данных, вам придется указать роль в другом документе.

Чтобы предоставить роль в базе данных, вам нужно действие grantRole в указанной базе данных.

Вот пример, чтобы дать вам четкую картину. Возьмем, к примеру, пользователя productUser00 в базе данных продуктов со следующими ролями:

 "roles" : [ { "role" : "assetsWriter", "db" : "assets" } ]

Операция grantRolesToUser предоставляет «productUser00» роль readWrite в базе данных акций и роль чтения в базе данных продуктов:

 use products db.runCommand({ grantRolesToUser: "productUser00", roles: [ { role: "readWrite", db: "stock"}, "read" ], writeConcern: { w: "majority" , wtimeout: 2000 } })

Пользователь productUser00 в базе продуктов теперь имеет следующие роли:

 "roles" : [ { "role" : "assetsWriter", "db" : "assets" }, { "role" : "readWrite", "db" : "stock" }, { "role" : "read", "db" : "products" } ]
информация о пользователях

Вы можете использовать команду usersInfo для возврата информации об одном или нескольких пользователях. Вот синтаксис:

 db.runCommand( { usersInfo: <various>, showCredentials: <Boolean>, showCustomData: <Boolean>, showPrivileges: <Boolean>, showAuthenticationRestrictions: <Boolean>, filter: <document>, comment: <any> } ) { usersInfo: <various> }

Что касается доступа, пользователи всегда могут просмотреть свою информацию. Чтобы просмотреть информацию другого пользователя, пользователь, выполняющий команду, должен иметь привилегии, включающие действие viewUser в базе данных другого пользователя.

Запустив команду userInfo , вы можете получить следующую информацию в зависимости от указанных параметров:

 { "users" : [ { "_id" : "<db>.<username>", "userId" : <UUID>, // Starting in MongoDB 4.0.9 "user" : "<username>", "db" : "<db>", "mechanisms" : [ ... ], // Starting in MongoDB 4.0 "customData" : <document>, "roles" : [ ... ], "credentials": { ... }, // only if showCredentials: true "inheritedRoles" : [ ... ], // only if showPrivileges: true or showAuthenticationRestrictions: true "inheritedPrivileges" : [ ... ], // only if showPrivileges: true or showAuthenticationRestrictions: true "inheritedAuthenticationRestrictions" : [ ] // only if showPrivileges: true or showAuthenticationRestrictions: true "authenticationRestrictions" : [ ... ] // only if showAuthenticationRestrictions: true }, ], "ok" : 1 }

Теперь, когда у вас есть общее представление о том, что вы можете сделать с помощью команды usersInfo , следующий очевидный вопрос, который может возникнуть, заключается в том, какие команды пригодятся для просмотра конкретных пользователей и нескольких пользователей?

Вот два удобных примера, иллюстрирующих то же самое:
Чтобы просмотреть конкретные привилегии и информацию для конкретных пользователей, но не учетные данные, для пользователя «Энтони», определенного в базе данных «офис», выполните следующую команду:

 db.runCommand( { usersInfo: { user: "Anthony", db: "office" }, showPrivileges: true } )

Если вы хотите просмотреть пользователя в текущей базе данных, вы можете упомянуть пользователя только по имени. Например, если вы находитесь в домашней базе данных, а пользователь с именем «Тимоти» существует в домашней базе данных, вы можете выполнить следующую команду:

 db.getSiblingDB("home").runCommand( { usersInfo: "Timothy", showPrivileges: true } )

Затем вы можете использовать массив, если хотите просмотреть информацию для разных пользователей. Вы можете либо включить необязательные поля showCredentials и showPrivileges , либо оставить их. Вот как будет выглядеть команда:

 db.runCommand({ usersInfo: [ { user: "Anthony", db: "office" }, { user: "Timothy", db: "home" } ], showPrivileges: true })
отозвать роли от пользователя

Вы можете использовать команду revokeRolesFromUser для удаления одной или нескольких ролей пользователя из базы данных, в которой эти роли присутствуют. Команда revokeRolesFromUser имеет следующий синтаксис:

 db.runCommand( { revokeRolesFromUser: "<user>", roles: [ { role: "<role>", db: "<database>" } | "<role>", ], writeConcern: { <write concern> }, comment: <any> } )

В упомянутом выше синтаксисе вы можете указать как пользовательские, так и встроенные роли в поле roles . Как и в случае с командой grantRolesToUser , вы можете указать роль, которую хотите отозвать, в документе или использовать ее имя.

Чтобы успешно выполнить команду revokeRolesFromUser , необходимо иметь действие revokeRole в указанной базе данных.

Вот пример, чтобы довести мысль до конца. Объект productUser00 в базе данных products имел следующие роли:

 "roles" : [ { "role" : "assetsWriter", "db" : "assets" }, { "role" : "readWrite", "db" : "stock" }, { "role" : "read", "db" : "products" } ]

Следующая команда revokeRolesFromUser удалит две роли пользователя: роль «чтение» из products и роль assetsWriter из базы данных «активы»:

 use products db.runCommand( { revokeRolesFromUser: "productUser00", roles: [ { role: "AssetsWriter", db: "assets" }, "read" ], writeConcern: { w: "majority" } } )

У пользователя productUser00 в базе данных продуктов осталась только одна роль:

 "roles" : [ { "role" : "readWrite", "db" : "stock" } ]

Команды управления ролями

Роли предоставляют пользователям доступ к ресурсам. Администраторы могут использовать несколько встроенных ролей для управления доступом к системе MongoDB. Если роли не охватывают желаемые привилегии, вы даже можете пойти дальше и создать новые роли в конкретной базе данных.

dropRole

С помощью команды dropRole вы можете удалить определяемую пользователем роль из базы данных, для которой вы запускаете команду. Чтобы выполнить эту команду, используйте следующий синтаксис:

 db.runCommand( { dropRole: "<role>", writeConcern: { <write concern> }, comment: <any> } )

Для успешного выполнения у вас должно быть действие dropRole в указанной базе данных. Следующие операции удалят роль writeTags из базы данных «products»:

 use products db.runCommand( { dropRole: "writeTags", writeConcern: { w: "majority" } } )
создать роль

Вы можете использовать команду createRole , чтобы создать роль и указать ее привилегии. Роль будет применяться к базе данных, для которой вы решите запустить команду. Команда createRole вернет ошибку повторяющейся роли, если роль уже существует в базе данных.

Чтобы выполнить эту команду, следуйте указанному синтаксису:

 db.adminCommand( { createRole: "<new role>", privileges: [ { resource: { <resource> }, actions: [ "<action>", ... ] }, ], roles: [ { role: "<role>", db: "<database>" } | "<role>", ], authenticationRestrictions: [ { clientSource: ["<IP>" | "<CIDR range>", ...], serverAddress: ["<IP>" | "<CIDR range>", ...] }, ], writeConcern: <write concern document>, comment: <any> } )

Привилегии роли будут применяться к базе данных, в которой эта роль была создана. Роль может наследовать привилегии от других ролей в своей базе данных. Например, роль, созданная для базы данных «admin», может включать привилегии, которые применяются либо к кластеру, либо ко всем базам данных. Он также может наследовать привилегии от ролей, присутствующих в других базах данных.

Чтобы создать роль в базе данных, вам нужно иметь две вещи:

  1. Действие grantRole в этой базе данных для указания привилегий для новой роли, а также для указания ролей, от которых следует наследоваться.
  2. Действие createRole для этого ресурса базы данных.

Следующая команда createRole создаст роль clusterAdmin в пользовательской базе данных:

 db.adminCommand({ createRole: "clusterAdmin", privileges: [ { resource: { cluster: true }, actions: [ "addShard" ] }, { resource: { db: "config", collection: "" }, actions: [ "find", "remove" ] }, { resource: { db: "users", collection: "usersCollection" }, actions: [ "update", "insert" ] }, { resource: { db: "", collection: "" }, actions: [ "find" ] } ], roles: [ { role: "read", db: "user" } ], writeConcern: { w: "majority" , wtimeout: 5000 } })
грантролестороле

С помощью команды grantRolesToRole вы можете назначать роли определяемой пользователем роли. Команда grantRolesToRole повлияет на роли в базе данных, в которой выполняется команда.

Эта команда grantRolesToRole имеет следующий синтаксис:

 db.runCommand( { grantRolesToRole: "<role>", roles: [ { role: "<role>", db: "<database>" }, ], writeConcern: { <write concern> }, comment: <any> } )

Привилегии доступа аналогичны команде grantRolesToUser — для правильного выполнения команды вам потребуется действие grantRole в базе данных.

В следующем примере вы можете использовать команду grantRolesToUser для обновления роли productsReader в базе данных «products» для наследования привилегий роли productsWriter :

 use products db.runCommand( { grantRolesToRole: "productsReader", roles: [ "productsWriter" ], writeConcern: { w: "majority" , wtimeout: 5000 } } )
отозвать привилегесфромроле

Вы можете использовать revokePrivilegesFromRole для удаления указанных привилегий из определяемой пользователем роли в базе данных, где выполняется команда. Для правильного выполнения вам необходимо помнить о следующем синтаксисе:

 db.runCommand( { revokePrivilegesFromRole: "<role>", privileges: [ { resource: { <resource> }, actions: [ "<action>", ... ] }, ], writeConcern: <write concern document>, comment: <any> } )

Чтобы отозвать привилегию, шаблон «ресурсный документ» должен соответствовать полю «ресурс» этой привилегии. Поле «действия» может быть либо точным совпадением, либо подмножеством.

Например, рассмотрим роль manageRole в базе данных products со следующими привилегиями, указывающими в качестве ресурса базу данных «managers»:

 { "resource" : { "db" : "managers", "collection" : "" }, "actions" : [ "insert", "remove" ] }

Вы не можете отменить действия «вставить» или «удалить» только из одной коллекции в базе данных менеджеров. Следующие операции не вызывают изменения роли:

 use managers db.runCommand( { revokePrivilegesFromRole: "manageRole", privileges: [ { resource : { db : "managers", collection : "kiosks" }, actions : [ "insert", "remove" ] } ] } )
 db.runCommand( { revokePrivilegesFromRole: "manageRole", privileges: [ { resource : { db : "managers", collection : "kiosks" }, actions : [ "insert" ] } ] } )

Чтобы отозвать действия «вставить» и/или «удалить» из роли manageRole , вам необходимо точно соответствовать документу ресурса. Например, следующая операция отменяет только действие «удалить» из существующей привилегии:

 use managers db.runCommand( { revokePrivilegesFromRole: "manageRole", privileges: [ { resource : { db : "managers", collection : "" }, actions : [ "remove" ] } ] } )

Следующая операция удалит несколько привилегий у «исполнительной» роли в базе данных менеджеров:

 use managers db.runCommand( { revokePrivilegesFromRole: "executive", privileges: [ { resource: { db: "managers", collection: "" }, actions: [ "insert", "remove", "find" ] }, { resource: { db: "managers", collection: "partners" }, actions: [ "update" ] } ], writeConcern: { w: "majority" } } )
ролиИнформация

Команда rolesInfo вернет информацию о привилегиях и наследовании для указанных ролей, включая как встроенные, так и определяемые пользователем роли. Вы также можете использовать команду rolesInfo для получения всех ролей, связанных с базой данных.

Для правильного выполнения следуйте этому синтаксису:

 db.runCommand( { rolesInfo: { role: <name>, db: <db> }, showPrivileges: <Boolean>, showBuiltinRoles: <Boolean>, comment: <any> } )

Чтобы вернуть информацию для роли из текущей базы данных, вы можете указать ее имя следующим образом:

 { rolesInfo: "<rolename>" }

Чтобы вернуть информацию о роли из другой базы данных, вы можете упомянуть роль в документе, в котором упоминается роль и база данных:

 { rolesInfo: { role: "<rolename>", db: "<database>" } }

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

 db.runCommand( { rolesInfo: { role: "executive", db: "managers" } } )

Следующая команда вернет информацию о наследовании роли: accountManager в базе данных, в которой выполняется команда:

 db.runCommand( { rolesInfo: "accountManager" } )

Следующая команда вернет как привилегии, так и наследование роли для роли «руководитель», как определено в базе данных менеджеров:

 db.runCommand( { rolesInfo: { role: "executive", db: "managers" }, showPrivileges: true } )

Чтобы указать несколько ролей, вы можете использовать массив. Вы также можете указать каждую роль в массиве в виде строки или документа.

Вы должны использовать строку, только если роль существует в базе данных, в которой выполняется команда:

 { rolesInfo: [ "<rolename>", { role: "<rolename>", db: "<database>" }, ] }

Например, следующая команда вернет информацию для трех ролей в трех разных базах данных:

 db.runCommand( { rolesInfo: [ { role: "executive", db: "managers" }, { role: "accounts", db: "departments" }, { role: "administrator", db: "products" } ] } )

Вы можете получить как привилегии, так и наследование роли следующим образом:

 db.runCommand( { rolesInfo: [ { role: "executive", db: "managers" }, { role: "accounts", db: "departments" }, { role: "administrator", db: "products" } ], showPrivileges: true } )

Встраивание документов MongoDB для повышения производительности

Базы данных документов, такие как MongoDB, позволяют вам определять схему в соответствии с вашими потребностями. Для создания оптимальных схем в MongoDB вы можете вкладывать документы. Таким образом, вместо того, чтобы сопоставлять ваше приложение с моделью данных, вы можете создать модель данных, соответствующую вашему варианту использования.

Боретесь с простоями и проблемами WordPress? Kinsta — это решение для хостинга, предназначенное для экономии вашего времени! Ознакомьтесь с нашими возможностями

Встроенные документы позволяют хранить связанные данные, к которым вы обращаетесь вместе. При разработке схем для MongoDB рекомендуется встраивать документы по умолчанию. Используйте соединения и ссылки на стороне базы данных или приложения только тогда, когда это целесообразно.

Убедитесь, что рабочая нагрузка может извлекать документ так часто, как это необходимо. При этом в документе также должны быть все необходимые данные. Это имеет решающее значение для исключительной производительности вашего приложения.

Ниже вы найдете несколько различных шаблонов для встраивания документов:

Шаблон встроенного документа

Вы можете использовать это для встраивания даже сложных подструктур в документы, с которыми они используются. Внедрение связанных данных в один документ может уменьшить количество операций чтения, необходимых для получения данных. Как правило, вы должны структурировать свою схему таким образом, чтобы ваше приложение получало всю необходимую информацию за одну операцию чтения. Следовательно, здесь следует помнить правило: то, что используется вместе, должно храниться вместе .

Шаблон встроенного подмножества

Шаблон встроенного подмножества представляет собой гибридный случай. Вы бы использовали его для отдельной коллекции длинного списка связанных элементов, где вы можете держать некоторые из этих элементов под рукой для отображения.

Вот пример списка обзоров фильмов:

 > db.movie.findOne() { _id: 321475, title: "The Dark Knight" } > db.review.find({movie_id: 321475}) { _id: 264579, movie_id: 321475, stars: 4 text: "Amazing" } { _id: 375684, movie_id: 321475, stars:5, text: "Mindblowing" }

Теперь представьте тысячу похожих обзоров, но вы планируете отображать только два самых последних, когда будете показывать фильм. В этом сценарии имеет смысл сохранить это подмножество в виде списка в документе фильма:

 > db.movie.findOne({_id: 321475}) { _id: 321475, title: "The Dark Knight", recent_reviews: [ {_id: 264579, stars: 4, text: "Amazing"}, {_id: 375684, stars: 5, text: "Mindblowing"} ] }</code

Проще говоря, если вы регулярно получаете доступ к подмножеству связанных элементов, убедитесь, что вы встроили его.

Независимый доступ

Возможно, вы захотите сохранить поддокументы в своей коллекции, чтобы отделить их от родительской коллекции.

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

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

Неограниченные списки

Хранение кратких списков связанной информации в их документе имеет недостаток. Если ваш список продолжает беспрепятственно расти, вам не следует помещать его в один документ. Это потому, что вы не сможете поддерживать его очень долго.

Этому есть две причины. Во-первых, у MongoDB есть ограничение на размер одного документа. Во-вторых, если вы обращаетесь к документу слишком часто, вы увидите отрицательные результаты из-за неконтролируемого использования памяти.

Проще говоря, если список начинает неограниченно расти, создайте коллекцию, чтобы хранить его отдельно.

Расширенный эталонный шаблон

Расширенный эталонный шаблон подобен шаблону подмножества. It also optimizes information that you regularly access to store on the document.

Here, instead of a list, it's leveraged when a document refers to another that is present in the same collection. At the same time, it also stores some fields from that other document for ready access.

Например:

 > db.movie.findOne({_id: 245434}) { _id: 245434, title: "Mission Impossible 4 - Ghost Protocol", studio_id: 924935, studio_name: "Paramount Pictures" }

As you can see, “the studio_id” is stored so that you can look up more information on the studio that created the film. But the studio's name is also copied to this document for simplicity.

To embed information from modified documents regularly, remember to update documents where you've copied that information when it is modified. In other words, if you routinely access some fields from a referenced document, embed them.

How To Monitor MongoDB

You can use monitoring tools like Kinsta APM to debug long API calls, slow database queries, long external URL requests, to name a few. You can even leverage commands to improve database performance. You can also use them to inspect the ase/” data-mce-href=”https://kinsta.com/knowledgebase/wordpress-repair-database/”>health of your database instances.

Why Should You Monitor MongoDB Databases?

A key aspect of database administration planning is monitoring your cluster's performance and health. MongoDB Atlas handles the majority of administration efforts through its fault-tolerance/scaling abilities.

Despite that, users need to know how to track clusters. They should also know how to scale or tweak whatever they need before hitting a crisis.

By monitoring MongoDB databases, you can:

  • Observe the utilization of resources.
  • Understand the current capacity of your database.
  • React and detect real-time issues to enhance your application stack.
  • Observe the presence of performance issues and abnormal behavior.
  • Align with your governance/data protection and service-level agreement (SLA) requirements.

Key Metrics To Monitor

While monitoring MongoDB, there are four key aspects you need to keep in mind:

1. MongoDB Hardware Metrics

Here are the primary metrics for monitoring hardware:

Normalized Process CPU

It's defined as the percentage of time spent by the CPU on application software maintaining the MongoDB process.

You can scale this to a range of 0-100% by dividing it by the number of CPU cores. It includes CPU leveraged by modules such as kernel and user.

High kernel CPU might show exhaustion of CPU via the operating system operations. But the user linked with MongoDB operations might be the root cause of CPU exhaustion.

Normalized System CPU

It's the percentage of time the CPU spent on system calls servicing this MongoDB process. You can scale it to a range of 0-100% by dividing it by the number of CPU cores. It also covers the CPU used by modules such as iowait, user, kernel, steal, etc.

User CPU or high kernel might show CPU exhaustion through MongoDB operations (software). High iowait might be linked to storage exhaustion causing CPU exhaustion.

Disk IOPS

Disk IOPS is the average consumed IO operations per second on MongoDB's disk partition.

Disk Latency

This is the disk partition's read and write disk latency in milliseconds in MongoDB. High values (>500ms) show that the storage layer might affect MongoDB's performance.

System Memory

Use the system memory to describe physical memory bytes used versus available free space.

The available metric approximates the number of bytes of system memory available. You can use this to execute new applications, without swapping.

Disk Space Free

This is defined as the total bytes of free disk space on MongoDB's disk partition. MongoDB Atlas provides auto-scaling capabilities based on this metric.

Swap Usage

You can leverage a swap usage graph to describe how much memory is being placed on the swap device. A high used metric in this graph shows that swap is being utilized. This shows that the memory is under-provisioned for the current workload.

MongoDB Cluster's Connection and Operation Metrics

Here are the main metrics for Operation and Connection Metrics:

Operation Execution Times

The average operation time (write and read operations) performed over the selected sample period.

Opcounters

It is the average rate of operations executed per second over the selected sample period. Opcounters graph/metric shows the operations breakdown of operation types and velocity for the instance.

Соединения

This metric refers to the number of open connections to the instance. High spikes or numbers might point to a suboptimal connection strategy either from the unresponsive server or the client side.

Query Targeting and Query Executors

This is the average rate per second over the selected sample period of scanned documents. For query executors, this is during query-plan evaluation and queries. Query targeting shows the ratio between the number of documents scanned and the number of documents returned.

Высокое числовое соотношение указывает на субоптимальные операции. Эти операции сканируют большое количество документов, чтобы вернуть меньшую часть.

Сканировать и заказать

Он описывает среднюю скорость запросов в секунду за выбранный период выборки. Он возвращает отсортированные результаты, которые не могут выполнить операцию сортировки с использованием индекса.

Очереди

Очереди могут описывать количество операций, ожидающих блокировки, записи или чтения. Высокие очереди могут отражать существование неоптимальной схемы. Это также может указывать на конфликтующие пути записи, что приводит к высокой конкуренции за ресурсы базы данных.

Метрики репликации MongoDB

Вот основные метрики для мониторинга репликации:

Окно репликации Oplog

Эта метрика показывает приблизительное количество часов, доступных в оплоге репликации первичного узла. Если вторичный сервер отстает больше, чем на это значение, он не может идти в ногу и ему потребуется полная повторная синхронизация.

Задержка репликации

Задержка репликации определяется как приблизительное количество секунд, в течение которых дополнительный узел отстает от основного в операциях записи. Высокая задержка репликации указывает на то, что вторичный сервер сталкивается с трудностями при репликации. Это может повлиять на задержку вашей операции, учитывая проблему чтения/записи соединений.

Запас репликации

Эта метрика относится к разнице между окном oplog основной репликации и задержкой репликации вторичной. Если это значение становится равным нулю, это может привести к переходу вторичного устройства в режим ВОССТАНОВЛЕНИЯ.

Opcounters -repl

Opcounters -repl определяется как средняя скорость операций репликации, выполняемых в секунду за выбранный период выборки. С помощью opcounters -graph/metric вы можете взглянуть на скорость операций и разбивку по типам операций для указанного экземпляра.

Оплог ГБ/час

Это определяется как средняя скорость гигабайт оплога, генерируемого первичным сервером в час. Высокие неожиданные объемы oplog могут указывать на крайне недостаточную рабочую нагрузку записи или проблему проектирования схемы.

Инструменты мониторинга производительности MongoDB

MongoDB имеет встроенные инструменты пользовательского интерфейса в Cloud Manager, Atlas и Ops Manager для отслеживания производительности. Он также предоставляет несколько независимых команд и инструментов для просмотра необработанных данных. Мы поговорим о некоторых инструментах, которые вы можете запустить с хоста, имеющего доступ и соответствующие роли для проверки вашей среды:

манготоп

Вы можете использовать эту команду для отслеживания количества времени, которое экземпляр MongoDB тратит на запись и чтение данных для каждой коллекции. Используйте следующий синтаксис:

 mongotop <options> <connection-string> <polling-interval in seconds>

rs.status()

Эта команда возвращает состояние набора реплик. Он выполняется с точки зрения члена, в котором выполняется метод.

монгостат

Вы можете использовать команду mongostat , чтобы получить краткий обзор состояния вашего экземпляра сервера MongoDB. Для оптимального вывода вы можете использовать его для просмотра одного экземпляра для определенного события, поскольку он предлагает просмотр в реальном времени.

Используйте эту команду для мониторинга базовой статистики сервера, такой как очереди блокировок, разбивка операций, статистика памяти MongoDB и соединения/сеть:

 mongostat <options> <connection-string> <polling interval in seconds>

dbStats

Эта команда возвращает статистику хранилища для конкретной базы данных, такую ​​как количество индексов и их размер, общее количество данных коллекции по сравнению с размером хранилища, а также статистику, связанную с коллекцией (количество коллекций и документов).

db.serverStatus()

Вы можете использовать команду db.serverStatus() , чтобы получить обзор состояния базы данных. Он дает вам документ, представляющий текущие счетчики метрик экземпляра. Выполняйте эту команду через равные промежутки времени, чтобы сопоставить статистику об экземпляре.

коллСтатистика

Команда collStats собирает статистику, аналогичную той, которую предлагает dbStats на уровне сбора. Его вывод состоит из количества объектов в коллекции, объема дискового пространства, занимаемого коллекцией, размера коллекции и информации, касающейся ее индексов для данной коллекции.

Все эти команды можно использовать для предоставления отчетов и мониторинга сервера базы данных в режиме реального времени, что позволяет отслеживать производительность базы данных и ошибки, а также помогать в принятии обоснованных решений по совершенствованию базы данных.

Как удалить базу данных MongoDB

Чтобы удалить базу данных, которую вы создали в MongoDB, вам нужно подключиться к ней с помощью ключевого слова use.

Допустим, вы создали базу данных с именем «Инженеры». Чтобы подключиться к базе данных, вы будете использовать следующую команду:

 use Engineers

Затем введите db.dropDatabase() , чтобы избавиться от этой базы данных. После выполнения вы можете ожидать вот такой результат:

 { "dropped" : "Engineers", "ok" : 1 }

Вы можете запустить команду showdbs , чтобы проверить, существует ли база данных.

Резюме

Чтобы выжать из MongoDB все до последней капли, вы должны хорошо понимать основы. Следовательно, очень важно знать базы данных MongoDB как свои пять пальцев. Для этого необходимо сначала ознакомиться с методами создания базы данных.
Ищете базу данных, обеспечивающую высокую гибкость и масштабируемость? MongoDB может быть ответом... Click to Tweet
В этой статье мы прольем свет на различные методы, которые вы можете использовать для создания базы данных в MongoDB, а затем подробное описание некоторых отличных команд MongoDB, которые помогут вам быть в курсе ваших баз данных. Наконец, мы завершили обсуждение, обсудив, как вы можете использовать встроенные документы и инструменты мониторинга производительности в MongoDB, чтобы обеспечить максимальную эффективность вашего рабочего процесса.

Что вы думаете об этих командах MongoDB? Мы упустили какой-то аспект или метод, который вы хотели бы здесь увидеть? Дайте нам знать об этом в комментариях!