Mongodb atlas что это

Обновлено: 02.07.2024

This sponsored post features a product relevant to our readers while meeting our editorial guidelines for being objective and educational.

Russian (Pусский) translation by Marat Amerov (you can also view the original English article)

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

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

К счастью, есть более простая альтернатива: MongoDB Atlas — полностью управляемая облачная версия базы данных.

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

В этом уроке я покажу вам, как создать кластер MongoDB Atlas и использовать его в приложении на Python.

Удаление документов из MongoDB с помощью Mongoose

Для того, чтобы удалить документы из БД MongoDB в Mongoose существуют методы remove() , deleteMany() , deleteOne() , findOneAndDelete() , findByIdAndRemove() и findOneAndRemove() .

Удаление одного документа с помощью model.findByIdAndRemove

В файл index.js скопируйте следующий код.

Метод findByIdAndRemove() находит документ по Id , заданному в первом параметре, и удаляяет этот документ. Если документ найден, то он возвращается в функцию обратного вызова (в данном случае, в параметр user ). Первый параметр Id может быть определен как строка "5e25a8e88170fb0f8ce90f71" , номер 345924 или объект < _id: "5e25a8e88170fb0f8ce90f71" >.

Удаление нескольких документов с помощью model.remove()

Функция Model.remove() полезна для удаления всех документов, соответствующих заданным критериям.

Примечание: Метод remove() возвращает не удаленный документ, а объект JSON, содержащий результат операции и количество удаленных элементов.

1 . Создание кластера

Чтобы иметь возможность использовать облачные сервисы MongoDB, вам понадобится учетная запись MongoDB Atlas. Чтобы создать ее, перейдите на домашнюю страницу и нажмите кнопку Get started free.

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

Чтобы свести к минимуму задержку сети, выберете регион, ближайший к вашему компьютеру. Пока же, поскольку мы создаем кластер пользования бесплатного уровня, убедитесь, что выбранный вами регион является тем, у которого есть свободный уровень. Кроме того, если вы используете виртуальную виртуальную машину Google или инстанс Amazon EC2 в качестве среды разработки, сначала выберите соответствующий облачный провайдер.

В разделе Cluster Tier выберите параметр M0, чтобы создать кластер бесплатного уровня. Он предлагает 512 МБ пространства для хранения, последнюю версию MongoDB с WiredTiger в качестве механизма хранения, набор реплик из трех узлов и щедрую пропускную способность 10 ГБ в неделю.

Наконец, дайте значимое имя кластеру и нажмите кнопку Create Cluster.

Теперь, MongoDB Atlas займет около пяти минут, чтобы настроить ваш кластер.

Использование model.findById() для поиска в базе данных по id

Когда в базу данных сохраняется документ, mongodb автоматически добавляет поле _id и присваивает ему уникальный буквенно-цифровой ключ. Поиск по _id является очень частой операцией, поэтому mongoose предоставляет специальный метод для этого - findById() .

В файл index.js скопируйте следующий код.

Основы MongoDB и Mongoose

MongoDB—база данных, которая хранит данные в виде документов для использования приложением. Как правило, документы имеют структуру, подобную JSON (JavaScript Object Notation—текстовый формат обмена данными, основанный на JavaScript). Mongo—нереляционная база данных “NoSQL”. Это означает, что Mongo хранит все связанные данные в одной записи, а не хранит их во многих заранее заданных таблицах, как в базе данных SQL. Некоторые преимущества этой модели хранения заключаются в следующем:

  • Масштабируемость: по умолчанию нереляционные базы данных распределяются (или “совместно используются”) на множество систем, а не только на одну. Это облегчает повышение производительности при меньших затратах.
  • Гибкость: новые наборы данных и свойств могут быть добавлены в документ без необходимости создавать новую таблицу для этих данных.
  • Репликация: копии базы данных выполняются параллельно, поэтому, если одна из них не работает, одна из копий становится новым основным источником данных.

Хотя существует много нереляционных баз данных, использование Mongo с JSON в качестве структуры хранения документов делает его логичным выбором при изучении бэкенда JavaScript. Доступ к документам и их свойствам подобен доступу к объектам в JavaScript.

Mongoose.js—модуль npm для Node.js, который позволяет вам писать объекты для Mongo так же, как и в JavaScript. Это может облегчить создание документов для хранения в Mongo.

Работа над задачами в этом руководстве потребует написания кода на Glitch.

Запустите этот проект на Glitch по этой ссылке или клонируйте этот репозиторий на GitHub!

8. Обновление и удаление документов

Очень похоже на методы insert_one() и insert_many() - методы update_one() и update_many() , которые вы можете использовать для изменения содержимого документов, которые уже находятся в вашей коллекции. Оба метода обновления, помимо новых данных, нуждаются в нулевом запросе на документы, которые необходимо изменить.

Вы можете использовать различные операторы обновления в своих методах обновления. Наиболее часто используемым является $set , который позволяет добавлять новые поля или обновлять значения существующих полей. В следующем коде показано, как добавить два документа с именем fiber и sugar в документ, где поле name установлено как «taco»:

Если запрос, переданный методу update_one() , возвращает более одного документа, обновляется только первый документ. Метод update_many() не имеет этого ограничения.

Наконец, используя методы delete_one() и delete_many() , вы можете удалять документы в своих коллекциях. Оба метода требуют запросы для определения того, какие документы необходимо удалить. Вот как вы можете удалить все документы, где в поле calories установлено менее 300:

Установка и настройка Mongoose и MongoDB

Дальнейшие действия предполагают, что у вас нет своего проекта, и что вы начнете с нуля.

В терминале создайте каталог myapp и сделайте его рабочим.

С помощью команды npm init создайте файл package.json .

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

Введите app.js или любое другое имя главного файла по своему желанию. Если вас устраивает index.js, нажмите клавишу ВВОД, чтобы принять предложенное имя файла по умолчанию.

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

Теперь установите модуль mongoose в каталоге myapp , набрав следующую команду в терминале.

После установки в каталоге myapp будут находится два файла package.json , package-lock.json и каталог node_modules . В файле package.json будут добавлены зависимости:

7. Выполнение запросов

Когда вы добавили несколько документов в свою коллекцию, вы можете запускать на ней запросы, вызывая метод find() , который возвращает объект Cursor , который вы можете перебрать. Если вы не передадите ему никаких аргументов, find возвращает все документы из коллекции.

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

Если вы хотите, чтобы метод find() возвращал только те документы, которые соответствуют определенным критериям, вы должны передать ему словарь Python. Например, если вы хотите найти документ, чье поле name установлено в «pizza», вы можете использовать следующий код:

Для более сложных запросов вы можете использовать интуитивно именуемые запросы MongoDB в словарях, которые вы передаете методу find() . Например, следующий код показывает вам, как использовать оператор $lt для поиска документов, где поле callories установлено меньше чем 280:

Используя точечную нотацию, вы также можете использовать вложенные поля в своих запросах. Следующий код показывает вам, как найти документы, чье поле trans , находящееся внутри поля fats , установлено в значение, которое больше или равно 0.5:

6. Вставка документов

Строка подключения по умолчанию, которую вы получаете от веб-интерфейса MongoDB Atlas, упоминает базу данных с именем test . Давайте продолжим использовать эту же базу данных. Вот как вы можете получить ссылку на неё:

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

Ради реалистического примера давайте создадим новую коллекцию, названную foods . С PyMongo вам не нужно явно ссылаться на какой-либо метод. Вы можете просто ссылаться на него так, как будто он уже существует.

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

Использование метода insert_one() - это самый простой способ добавить документ в коллекцию. Чтобы указать содержимое документа, вы передаете словарь Python в этот метод. Следующий пример кода показывает вам, как это делается:

Добавление документов по одному может быть неэффективным. С помощью метода insert_many() вы можете сразу добавить несколько документов в свою коллекцию. Он ожидает набор словарей в качестве входных параметров. Следующий код добавляет еще два документа в коллекцию:

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

5. Подключение к кластеру

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

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

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

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

Теперь вы можете попробовать запустить скрипт.

Переменные окружения в файле .env

Для хранения переменных окружения вы будете использовать файл .env . Создайте его в корне проекта и скопируйте в него URI базы данных MongoDB Atlas, полученный раннее:

Обратите внимание: URI окружен одинарными (можно двойными) кавычками; между переменной MONGO_URI и знаком = , а также, между знаком = и URI не должно быть пробела; замените на имя пользователя, а

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

Для того, чтобы переменные окружения из файла env можно было использовать в приложении нужно установить пакет dotenv :

В файле package.json будет добавлена зависимость:

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

Теперь все переменные из файла .env будут доступны в process.env . Чтобы прочитать значение переменной, например, PASSWORD нужно обратиться к свойству process.env.PASSWORD .

Обновление документов в БД с помощью стандартного поиска, присвоения и сохранения

Для того, чтобы изменить (обновить) документ в базе данных, в mongoose существуют методы update , findByIdAndUpdate и findOneAndUpdate . Но сначала нелишнем будет узнать о классическом способе изменения документов. Этот способ состоит из уже изученных вами методов, а именно: findOne , findById и save .

В файл index.js скопируйте следующий код.

Создание и сохранение записи модели

В файле index.js замените содержимое на следующий код.

В вашей базе данных теперь должен быть один документ с именем “Ivan Petrov”.

Atlas как сервис

Приглашаем также всех желающих на двухдневный интенсив «MongoDB Map-Reduce Framework».
— Темы 1 дня: CRUD-операции; фильтрация по полям; sort , skip , limit ; запросы по поддокументам.
— Темы 2 дня: концепция map-reduce; концепция pipeline ; структура и синтаксис агрегации; стадия $match ; стадия $group ; стадия $lookup .


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

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

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


Архитектура

Хотя API-интерфейсы Atlas можно вызывать непосредственно из клиентского интерфейса, мы решили использовать трехуровневую архитектуру. Ее преимущества заключаются в следующем:

возможность ограничивать доступную функциональность по мере необходимости;

возможность упростить API-интерфейсы, доступные разработчикам клиентских частей приложений;

возможность тонкой настройки защиты конечных точек API.

Мы могли бы воспользоваться другими функциями серверной части, например триггерами, интеграцией с Twilio и т. д.

Конечно же, для размещения среднего уровня мы выбрали Realm.


Реализация

Серверная часть


Использование model.findOne() для возвращения одного документа из базы данных

В mongoose есть метод findOne() , который ведет себя как метод find() , но возвращает только один документ (не массив). Даже если документов с данным параметром поиска несколько метод findOne() возвращает первый найденный документ. Это особенно полезно при поиске по свойствам, которые вы объявили уникальными.

В файл index.js скопируйте следующий код.

Метод findOne() находит в базе данных первый попавшийся документ со свойством < name: "Светлана" >и возвращает его. Если в качестве первого параметра в функции findOne() ничего не указано, mongoose вернет произвольный документ.

Заключение

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

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

Создание модели

CRUD Часть I - создание

CRUD - это сокращение для операций Create, Read, Update and Delete (создать, прочесть, обновить и удалить). Эти операции являются основными для работы с базами данных, таких как MongoDB.

В mongoose все завязано на 2х ключевых понятиях Схема(Schema) – описание сущности и Модель – сама сущность.

Создадайте схему и модель из неё.

В файл index.js скопируйте следующий код.

Каждое поле в mongoose.Schema характеризуется типом и может иметь дополнительные характеристики: default , min и max (для Number), match и enum (для String), index и unique (для индексов). Подробнее о типах можно почитать тут.

В функции mongoose.model первый параметр - это имя модели, второй параметр - имя схемы, из которой создается модель.

Схемы - это строительный блок для моделей. Модель позволяет создавать экземпляры ваших объектов, называемых документами.

Размещение бесплатного экземпляра mongodb для проектов в MongoDB Atlas

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

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

  1. Для создания базы данных MongoDB и разработки приложения использовать собственный компьютер. Для этого вы должны установить сервер Node и сервер базы данных MongoDB на своем ПК.
  2. Для создания базы данных MongoDB использовать облачный сервис MongoDB Atlas, а приложение разрабатывать и запускать на локальном ПК. Этот способ будет рассмотрен в данной статье.
  3. Для создания базы данных MongoDB использовать облачный сервис MongoDB Atlas, а приложение разрабатывать и запускать на каком-нибудь облачном сервисе, например Glitch.

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

Использование model.find() для поиска в базе данных

В файл index.js скопируйте следующий код.

Первый параметр в функции find() - это селектор, являющийся объектом, который указывает, что нужно искать в базе данных. Если селектор не указан, возвращаются все документы из БД. Вторым параметром в функции find() является функция обратного вызова.

Функция find() находит и возвращает все документы, соответствующие селектору. Результатом будет массив документов.

Если в результате будет слишком много документов, чтобы поместиться в памяти, используйте функцию cursor()

Цепочка помощников по поисковым запросам для сужения результатов поиска

Если вы не передадите функцию обратнного вызова в качестве последнего аргумента в методе Model.find() (или в других методах поиска), то запрос не будет выполнен. Запрос можно сохранить в переменной для последующего использования. Этот тип объектов позволяет построить запрос с использованием цепочечного синтаксиса. Фактический поиск в БД выполняется, когда вы окончательно прицепите метод .exec() . Вы всегда должны передавать свою функцию обратного вызова этому последнему методу. Есть много помощников запроса, здесь вы узнаете о самых “известных” из них.

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

limit(2) - Ограничивает максимальное количество документов, возвращаемых в запросе, - двумя.

14 вещей, которые я хотел бы знать перед началом работы с MongoDB


К сожалению, MongoDB по умолчанию ставится без аутентификации. Для рабочей станции, доступ к которой устанавливается локально, такая практика нормальна. Но поскольку MongoDB – это многопользовательская система, которая любит использовать большие объемы памяти, будет лучше, если вы поставите ее на сервер с максимально возможным в ваших условиях количеством оперативной памяти, даже если собираетесь использовать ее только для разработки. Установка на сервер через порт по умолчанию может оказаться проблемной, особенно, если в запросе можно выполнить любой код на javascript (например, $where в качестве идеи для инъекции).

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

Не забудьте привязать поверхность атаки к MongoDB

Чек-лист обеспечения безопасности MongoDB содержит хорошие советы для снижения риска проникновения в сеть и утечки данных. Легко отмахнуться и сказать, что сервер для разработки не нуждается в высоком уровне безопасности. Однако все не так просто и это относится ко всем серверам MongoDB. В частности, если нет веской причины использовать mapReduce , group или $where, нужно отключить использование произвольного кода на JavaScript, написав в файле конфигурации javascriptEnabled:false . Поскольку в стандартной MongoDB файлы данных не зашифрованы, разумно запускать MongoDB с Dedicated User, у которого есть полный доступ к файлам, с ограниченным доступом только для него и возможностью использовать собственные средства управления доступом к файлам операционной системы.

Ошибка при разработке схемы

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

Классическая статья «6 эмпирических правил для проектирования схем MongoDB» стоит того, чтобы ее прочитать, а такие функции, как Schema Explorer в стороннем инструменте Studio 3T, стоит использовать для регулярных проверок схем.

Не забудьте о порядке сортировки

Забыв о порядке сортировки можно сильнее всего разочароваться и потерять больше времени, чем при использовании любой другой неправильной конфигурации. По умолчанию MongoBD использует бинарную сортировку. Но вряд ли она будет кому-то полезна. Чувствительные к регистру, ударению, бинарные сортировки считались любопытными анахронизмами наряду с бусами, кафтанами и завивающимися усами еще в 80-х годах прошлого века. Теперь же их использование непростительно. В реальной жизни «мотоцикл» – это то же самое, что и «Мотоцикл». А «Британия» и «британия» – одно и то же место. Строчная буква – это просто прописной эквивалент большой буквы. И не заставляйте меня говорить о сортировке диакритических знаков. При создании базы данных в MongoDB используйте параметры сортировки без учета ударения и регистра, которые соответствуют языку и культуре пользователей системы. Так вы значительно упростите поиск по строковым данным.

Создание коллекций с большими документами

MongoDB рада разместить большие документы размером до 16 МБ в коллекциях, а GridFS предназначена для больших документов размером больше 16 МБ. Но только потому, что большие документы там можно разместить, хранить их там не лучшая идея. Лучше всего MongoDB будет работать, если вы будете сохранять отдельные документы размером в несколько килобайт, рассматривая их больше, как строки в широкой SQL-таблице. Большие документы будут источником проблем с производительностью.

Создание документов с большими массивами

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

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

Не забудьте, что порядок стадий в агрегации имеет значение

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

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

Такие инструменты как Studio 3T упростят построение запросов агрегации в MongoDB. Функция Aggregation Editor позволит вам применять операторы пайплайна по одному этапу за раз, а также проверять входные и выходные данные на каждом этапе для упрощения дебага.

Использование быстрой записи

Никогда не устанавливайте в MongoDB параметры записи с высокой скоростью, но низкой надежностью. Этот режим «file-and-forget» кажется быстрым, поскольку команда возвращается до того, как осуществляется запись. Если система упадет до того, как данные будут записаны на диск, они потеряются и окажутся в несогласованном состоянии. К счастью, в 64-битном MongoDB включено журналирование.

Движки для хранения MMAPv1 и WiredTiger используют логирование для предотвращения этого, хотя WiredTiger может восстановиться до последней согласованной контрольной точки, если журналирование отключено.

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

Чтобы быть уверенным в записях, убедитесь, что в файле конфигурации журналирование включено (storage.journal.enabled) , а периодичность записей соответствует тому объему информации, который вы можете позволить себе потерять.

Сортировка без индекса

При поиске и агрегировании часто возникает необходимость в сортировке данных. Будем надеяться, что это делается на одном из заключительных этапов, после фильтрации результата с целью уменьшения объема сортируемых данных. И даже в таком случае для сортировки вам понадобится индекс. Можно воспользоваться одиночным или составным индексом.

Если подходящего индекса нет, MongoDB обойдется без него. Существует ограничение памяти в 32 Мб на общий размер всех документов в операции сортировки, и если MongoDB достигнет этого предела, то она либо выдаст ошибку, либо вернет пустой набор записей.

Поиск без поддержки индексов

Поисковые запросы выполняют функцию аналогичную операции JOIN в SQL. Для лучшей работы им нужен индекс значения ключа, используемого в качестве внешнего ключа. Это неочевидно, поскольку использование не отражено в explain() . Такие индексы являются дополнением к индексу, записанному в explain() , который в свою очередь используется операторами пайплайна $match и $sort , когда те встречаются в начале пайплайна. Индексы теперь могут охватывать любую стадию пайплайна агрегации.

Отказ от использования мультиобновлений

Метод db.collection.update() используется для изменения части существующего документа или целого документа, вплоть до полной замены в зависимости от заданного вами параметра update . Не так очевидно, что он не обработает все документы в коллекции, пока вы не установите параметр multi для обновления всех документов, отвечающих критериям запроса.

Не забудьте о важности порядка ключей в хэш-таблице

В JSON объект состоит из неупорядоченной коллекции размером ноль или более пар имя/значение, где имя – это строка, а значение – это строка, число, логическое значение, ноль, объект или массив.

К сожалению, BSON придает большое значение порядку при поиске. В MongoDB порядок ключей внутри встроенных объектов имеет значение, т.е. < firstname: "Phil", surname: "factor" >– это не то же самое, что < < surname: "factor", firstname: "Phil" >. То есть вы должны хранить в документах порядок пар имя/значение, если хотите быть уверены в том, что найдете их.

Не путайте «null» и «undefined»

Значение «undefined» никогда не было допустимым в JSON, согласно официальному стандарту JSON (ECMA-404, Раздел 5), несмотря на то, что оно используется в JavaScript. Более того, для BSON оно устарело и преобразовывается в $null , что не всегда является хорошим решением. Избегайте использования «undefined» в MongoDB.

Использование $limit() без $sort()

Очень часто, когда вы ведете разработку в MongoDB, полезно просто увидеть образец результата, который вернется из запроса или агрегации. Для этой задачи вам пригодится $limit() , но его никогда не должно быть в финальной версии кода, если только перед ним вы не используете $sort . Эта механика нужна, поскольку иначе вы не можете гарантировать порядок результата, и не сможете надежно просматривать данные. В верхней части результата вы будете получать разные записи в зависимости от сортировки. Для надежной работы запросы и агрегации должны быть детерминированными, то есть выдавать одинаковые результаты при каждом выполнении. Код, в котором есть $limit() , но нет $sort , не будет являться детерминированным и впоследствии может вызвать ошибки, которые будет трудно отследить.

Заключение

Единственный способ разочароваться в MongoDB – это сравнивать ее непосредственно с другим типом баз данных, таким как СУБД, или прийти к ее использованию, исходя из каких-то определенных ожиданий. Это все равно что сравнивать апельсин с вилкой. Системы баз данных преследуют определенные цели. Лучше всего просто понять и оценить для себя эти различия. Было бы стыдно давить на разработчиков MongoDB из-за пути, который вынудил их идти по пути СУБД. Мне хочется видеть новые и интересные способы решения старых проблем, таких как обеспечение целостности данных и создание систем данных, устойчивых к сбоям и атакам злоумышленников.

Внедрение в MongoDB в версии 4.0 ACID transactionality — хороший пример внедрения важных улучшений инновационным путем. Мультидокументальные и мультиоператорные транзакции теперь атомарные. Также появилась возможность регулировать время, необходимое для получения блокировок, и заканчивать зависшие транзакции, а также изменять уровень изоляции.

Обновление документов в БД с помощью model.findOneAndUpdate()

В последних версиях mongoose есть методы, упрощающие обновление документов. Но некоторые более продвинутые функции (например, хуки pre/post, валидация) ведут себя по-другому при этом подходе, поэтому классический метод все еще полезен во многих ситуациях.

В файл index.js скопируйте следующий код.

3 . Получение строки подключения

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

В открывшемся диалоговом окне выберите параметр Connect Your Application и нажмите кнопку I'm using driver 3.6 or later. Теперь вы можете увидеть строку подключения. У него не будет вашего фактического пароля, поэтому вам придется его вводить вручную. После этого сделайте заметку о строке, чтобы позже ее использовать.

Создание нескольких записей с помощью model.create()

Выше было показано, как сохранить документ в базе данных mongodb с помощью метода mongoose save() . Но что если нужно сохранить много документов, например, из массива. Для этого можно применить другой метод mongoose - create() .

В файле index.js замените содержимое на следующий код.

Первый аргумент в методе Model.create() - это документы в виде массива или объекта, которые будут вставлены в БД. Второй аргумент - это функция обратного вызова.

В функции обратного вызова в первый аргумент err передается ошибка, а во второй аргумент users передаётся массив arrayUsers .

4 . Установка Python Drive

Чтобы иметь возможность взаимодействовать с вашим кластером MongoDB Atlas, на вашем компьютере должен быть установлен драйвер MongoDB. Для языка программирования Python, PyMongo - самый популярный драйвер на сегодня. Рекомендуемый способ установки на вашем компьютере - использовать модуль pip , как показано ниже:

Возможно, вы заметили, что ваша строка соединения Atlas Atlas - это mongodb+srv:// URI. Чтобы драйвер работал с записями DNS SRV, вы также должны установить модуль dnspython . Пример:

Предварительные требования

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

2 . Настройка кластера

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

Во-первых, в разделе MongoDB Users вы должны создать нового пользователя, нажав кнопку Add new user. В появившемся диалоговом окне введите нужное имя пользователя и пароль, выберите Read and write to any database и нажмите кнопку Add User.

Затем в разделе IP Whitelist вы должны указать список IP-адресов, с которых вы будете обращаться к кластеру. На данный момент достаточно указать текущий IP-адрес вашего компьютера.

API Atlas

API-интерфейсы Atlas обернуты в набор функций Realm.


По большей части все они вызывают API Atlas следующим образом (здесь мы взяли для примера getOneCluster ):

Исходный код каждой функции размещен на GitHub.

API MiniAtlas

Следующий шаг — представление функций как конечных точек, которые может использовать клиентская часть. В качестве альтернативы мы могли бы вызывать функции с помощью Realm Web SDK, но мы решили придерживаться протокола REST; он более знаком нашим веб-разработчикам.

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

Подключение БД MongoDB

В корне проекта создайте файл index.js , в который скопируйте следующий код.

В функции connect() первый параметр process.env.MONGO_URI - это URI для подключения приложения к БД (в данном случае значение свойства MONGO_URI хранится в файле .env ). Вторым параметром в функции connect() является необязательный объект опций. Третий параметр - это функция обратного вызова, которая будет вызвана после попытки соединения с базой данных.

Читайте также: