Статьи

Начало работы с Python и MongoDB

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

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

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

  • Создайте бесплатную размещенную базу данных MongoDB, используя MongoDB Atlas
  • Установите PyMongo, драйвер Python
  • Подключиться к MongoDB
  • Ознакомьтесь с коллекциями и документами MongoDB
  • Выполните основные операции создания, извлечения, обновления и удаления (CRUD) с помощью PyMongo

Давайте начнем!

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

Установите драйвер Python

Для этой статьи мы установим драйвер Python под названием «PyMongo».

Хотя есть и другие драйверы, написанные сообществом, PyMongo является официальным драйвером Python для MongoDB. Для подробной документации водителя ознакомьтесь с документацией здесь .

Самый простой способ установить драйвер — это система управления пакетами pip. Выполните следующее в командной строке:

python -m pip install pymongo 

Примечание. Если вы используете кластер Atlas M0 (Free Tier), вы должны использовать Python 2.7.9+ и Python 3.4 или новее. Вы можете проверить, какие версии Python и PyMongo вы установили, введя команды python --version и pip list соответственно.

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

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

 from pymongo import MongoClient # pprint library is used to make the output look more pretty from pprint import pprint # connect to MongoDB, change the << MONGODB URL >> to reflect your own connection string client = MongoClient(<<MONGODB URL>>) db=client.admin # Issue the serverStatus command and print the results serverStatusResult=db.command("serverStatus") pprint(serverStatusResult) 

Замените <<MONGODB URL>> строкой вашего подключения к MongoDB. Сохраните этот файл как mongodbtest.py и запустите его из командной строки через python mongodbtest.py .

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

 {u'asserts': {u'msg': 0, u'regular': 0, u'rollovers': 0, u'user': 0, u'warning': 0}, u'connections': {u'available': 96, u'current': 4, u'totalCreated': 174L}, u'extra_info': {u'note': u'fields vary by platform', u'page_faults': 0}, u'host': u'cluster0-shard-00-00-6czvq.mongodb.net:27017', u'localTime': datetime.datetime(2017, 4, 4, 0, 18, 45, 616000), . . . } 

Обратите внимание, что символ u взят из вывода Python, и это означает, что строки хранятся в Unicode. В этом примере также используется библиотека pprint , которая не связана с MongoDB, но используется здесь только для того, чтобы сделать вывод структурированным и визуально привлекательным с консоли.

В этом примере мы подключаемся к нашему экземпляру MongoDB и db.serverStatus() команду ( ссылка ) db.serverStatus() ). Эта команда возвращает информацию о нашем экземпляре MongoDB и используется в этом примере как способ выполнения команды для MongoDB.

Если ваше приложение работает успешно, вы готовы продолжить!

Изучение коллекций и документов

MongoDB хранит данные в документах. Документы — это не документы Microsoft Word или Adode PDF, а документы JSON, основанные на спецификации JSON .

Пример документа JSON будет следующим:

Пример документа JSON

Обратите внимание, что документы — это не просто пары ключ / значение, но могут содержать массивы и вложенные документы. Сами данные могут быть разными типами данных, такими как геопространственные, десятичные и ISODate. Внутри MongoDB хранится двоичное представление JSON, известное как BSON. Это позволяет MongoDB предоставлять типы данных, такие как десятичные, которые не определены в спецификации JSON. Для получения дополнительной информации о спецификации BSON посетите его сайт .

Коллекция в MongoDB — это контейнер для документов. База данных — это контейнер для коллекций. Эта группировка похожа на реляционные базы данных и изображена ниже:

Реляционная концепция MongoDB эквивалент
База данных База данных
таблицы Коллекции
Ряды документы
Показатель Показатель

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

Давайте посмотрим, как выполнять основные операции CRUD над документами в MongoDB с использованием PyMongo.

Выполнение основных операций CRUD с использованием PyMongo

Чтобы установить соединение с MongoDB с PyMongo, вы используете класс MongoClient.

 from pymongo import MongoClient client = MongoClient('<<MongoDB URL>>') 

<<MongoDB URL>> является заполнителем для строки подключения к MongoDB. См. Документацию по строке подключения для получения подробной информации о том, как создать строку подключения MongoDB. Если вы используете Atlas для своей базы данных MongoDB, обратитесь к разделу «Проверка подключения» для получения дополнительной информации о получении строки подключения для MongoDB Atlas.

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

 db = client.business 

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

Пример генерации примера кода данных

Создайте новый файл createsamples.py с помощью инструмента разработки или текстового редактора командной строки и скопируйте следующий код:

 from pymongo import MongoClient from random import randint #Step 1: Connect to MongoDB - Note: Change connection string as needed client = MongoClient(port=27017) db=client.business #Step 2: Create sample data names = ['Kitchen','Animal','State', 'Tastey', 'Big','City','Fish', 'Pizza','Goat', 'Salty','Sandwich','Lazy', 'Fun'] company_type = ['LLC','Inc','Company','Corporation'] company_cuisine = ['Pizza', 'Bar Food', 'Fast Food', 'Italian', 'Mexican', 'American', 'Sushi Bar', 'Vegetarian'] for x in xrange(1, 501): business = { 'name' : names[randint(0, (len(names)-1))] + ' ' + names[randint(0, (len(names)-1))] + ' ' + company_type[randint(0, (len(company_type)-1))], 'rating' : randint(1, 5), 'cuisine' : company_cuisine[randint(0, (len(company_cuisine)-1))] } #Step 3: Insert business object directly into MongoDB via isnert_one result=db.reviews.insert_one(business) #Step 4: Print to the console the ObjectID of the new document print('Created {0} of 100 as {1}'.format(x,result.inserted_id)) #Step 5: Tell us that you are done print('finished creating 100 business reviews') 

Обязательно измените URL-адрес подключения клиента MongoDB на тот, который указывает на экземпляр базы данных MongoDB. Как только вы запустите это приложение, в базе данных MongoDB, называемой business будет создано 500 предприятий с произвольным именем и соответствующими им рейтингами. Все эти предприятия созданы в единой коллекции под названием reviews . Обратите внимание, что нам не нужно явно создавать базу данных заранее, чтобы использовать ее. Это отличается от других баз данных, которые требуют, чтобы операторы, такие как CREATE DATABASE выполнялись первыми.

Команда, которая вставляет данные в MongoDB в этом примере, является insert_one() . Немного insert_one , insert_one вставит один документ в MongoDB. Результирующий набор вернет единственный ObjectID, который был создан. Это один из немногих способов вставки данных. Если вы хотите вставить несколько документов за один вызов, вы можете использовать функцию insert_many .

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

Для получения подробной информации о результирующем наборе insert_many ознакомьтесь с этим разделом документации .

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

Изучение данных бизнес-обзора

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

В MongoDB команда find_one используется для запроса одного документа, так же, как операторы select используются в реляционных базах данных. Чтобы использовать команду find_one в PyMongo, мы передаем словарь Python, который определяет критерии поиска. Например, давайте найдем одну компанию с оценкой 5 баллов, передав словарь { 'rating' : 5 } .

 fivestar = db.reviews.find_one({'rating': 5}) print(fivestar) 

Результат будет содержать данные, подобные следующим:

 {u'rating': 5, u'_id': ObjectId('58e65383ea0b650c867ef195'), u'name': u'Fish Salty Corporation', u'cuisine': u'Sushi Bar'} 

Учитывая, что мы создали 500 образцов данных, должно быть несколько предприятий с рейтингом 5. Метод find_one — это всего лишь один из серии операторов поиска, поддерживающих запрос данных MongoDB. Другой оператор, называемый find , вернет курсор на все документы, которые соответствуют критериям поиска. Эти курсоры также поддерживают такие методы, как count() , который возвращает количество результатов в запросе. Чтобы найти общее количество предприятий с рейтингом 5, мы можем использовать метод count() следующим образом:

 fivestarcount = db.reviews.find({'rating': 5}).count() print(fivestarcount) 

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

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

 from pymongo import MongoClient # Connect to the MongoDB, change the connection string per your MongoDB environment client = MongoClient(port=27017) # Set the db object to point to the business database db=client.business # Showcasing the count() method of find, count the total number of 5 ratings print('The number of 5 star reviews:') fivestarcount = db.reviews.find({'rating': 5}).count() print(fivestarcount) # Not let's use the aggregation framework to sum the occurrence of each rating across the entire data set print('\nThe sum of each rating occurance across all data grouped by rating ') stargroup=db.reviews.aggregate( # The Aggregation Pipeline is defined as an array of different operations [ # The first stage in this pipe is to group data { '$group': { '_id': "$rating", "count" : { '$sum' :1 } } }, # The second stage in this pipe is to sort the data {"$sort": { "_id":1} } # Close the array with the ] tag ] ) # Print the result for group in stargroup: print(group) 

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

Обновление данных с помощью PyMongo

Подобно insert_one и insert_many , есть функции, которые помогут вам обновить данные MongoDB, включая update_one , update_many и replace_one . Метод update_one обновит один документ на основе запроса, который соответствует документу. Например, предположим, что наше приложение для бизнес-анализа теперь позволяет пользователям «любить» бизнес. Чтобы проиллюстрировать обновление документа этим новым полем «лайки», давайте сначала посмотрим, как выглядит существующий документ после вставки нашего предыдущего приложения в MongoDB. Далее, давайте обновим документ, запросим документ и посмотрим на изменение.

 from pymongo import MongoClient #include pprint for readabillity of the from pprint import pprint #change the MongoClient connection string to your MongoDB database instance client = MongoClient(port=27020) db=client.business ASingleReview = db.reviews.find_one({}) print('A sample document:') pprint(ASingleReview) result = db.reviews.update_one({'_id' : ASingleReview.get('_id') }, {'$inc': {'likes': 1}}) print('Number of documents modified : ' + str(result.modified_count)) UpdatedDocument = db.reviews.find_one({'_id':ASingleReview.get('_id')}) print('The updated document:') pprint(UpdatedDocument) 

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

 A sample document: {'_id': ObjectId('58eba417ea0b6523b0fded4f'), 'cuisine': 'Pizza', 'name': 'Kitchen Goat Corporation', 'rating': 1} Number of documents modified : 1 The updated document: {'_id': ObjectId('58eba417ea0b6523b0fded4f'), 'cuisine': 'Pizza', 'likes': 1, 'name': 'Kitchen Goat Corporation', 'rating': 1} 

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

Если вы хотите обновить все поля документа и сохранить один и тот же ObjectID, вам нужно использовать функцию replace_one . Для более подробной информации о replace_one ознакомьтесь с документацией PyMongo здесь .

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

Удаление документов

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

 result = db.restaurants.delete_many({“category”: “Bar Food“}) 

Если вы удаляете большое количество документов, может быть эффективнее удалить коллекцию, а не удалять все документы.

Куда идти дальше

Существует много вариантов изучения MongoDB и Python. Университет MongoDB — отличное место для начала и изучения администрирования, развития и других тем, таких как аналитика с MongoDB. В частности, одним из курсов является MongoDB для разработчиков (Python). Этот курс охватывает темы этой статьи гораздо глубже, включая обсуждение структуры агрегации MongoDB. Проверьте это здесь .

Приложение: Создание бесплатного уровня базы данных MongoDB Atlas

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

Создайте свой кластер бесплатно

Для создания бесплатной базы данных MongoDB выполните следующие действия:

  1. Перейти к MongoDB Atlas .
  2. Нажмите кнопку «Начать бесплатно».
  3. Заполните форму для создания учетной записи. Вы будете использовать эту информацию для входа и управления своим MongoDB.

После того как вы заполните форму, веб-сайт создаст вашу учетную запись, и вы увидите всплывающее окно «Создайте свой новый кластер», как показано ниже:

Создайте свой новый кластер

Чтобы использовать бесплатный уровень, прокрутите вниз и выберите «M0». Когда вы сделаете это, панель регионов будет отключена. Уровень бесплатного пользования имеет некоторые ограничения, и одним из них может быть возможность выбрать регион. Размер вашей базы данных будет ограничен 512 МБ. Учитывая, что, когда вы готовы использовать MongoDB не только для простых операций, вы можете легко создать другой экземпляр, выбрав размер из списка «Размер экземпляра». Прежде чем нажать «Подтвердить и развернуть», прокрутите страницу вниз и обратите внимание на дополнительные параметры, показанные здесь:

Дополнительные параметры в диалоговом окне «Создать новый кластер»

Во всплывающем окне «Построить свой новый кластер» вы можете увидеть, что доступны другие варианты, включая выбор набора реплик из 3, 5 или 7 узлов и до кластера из 12 сегментов. Обратите внимание, что уровень бесплатного доступа не позволяет вам выбирать что-либо большее, чем кластер из 3 узлов, но если вы перейдете в другие размеры, эти опции станут доступны.

На данный момент мы почти готовы — последнее, к чему стоит обратиться — это имя пользователя и пароль администратора. Вы также можете выбрать случайный пароль, сгенерированный для вас, нажав кнопку «Автоматически создать безопасный пароль». Наконец, нажмите кнопку «Подтвердить и развернуть», чтобы создать кластер Atlas.

Настройка вашего белого списка IP

Пока Atlas создает вашу базу данных, вам нужно будет определить, каким IP-адресам разрешен доступ к вашей новой базе данных, поскольку MongoDB Atlas по умолчанию не разрешает доступ из Интернета. Этот список предоставленных IP-адресов называется «Белый список IP-адресов». Чтобы добавить IP-адрес вашей машины в этот список, нажмите вкладку «Безопасность», затем «Белый список IP-адресов», а затем нажмите кнопку «+ ДОБАВИТЬ IP-АДРЕС». Появится другое диалоговое окно, показанное ниже.

Добавить запись в белый список

Вы можете нажать кнопку «Добавить текущий IP-адрес», чтобы добавить свой IP-адрес или указать конкретный IP-адрес, или включить доступ к миру, вообще не ограничивая IP-адреса (не фантастическая идея, но в случае, если у вас нет другого выбора и нужно разрешить аутентификацию с любого IP).

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

Cluster0 готов к действию

Тестирование вашего соединения

Мы хотим убедиться, что база данных MongoDB доступна из нашего окна разработки, прежде чем мы начнем вводить код. Быстрый способ проверить это — установить соединение с помощью инструмента командной строки Mongo Shell. Убедитесь, что ваша информация о подключении MongoDB доступна. Если вы используете MongoDB Atlas, вы можете получить информацию о соединении, нажав кнопку «Подключиться» на вкладке «Кластеры», как показано ниже.

Кнопка подключения кластера MongoDB Atlas

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

Соединиться с Mongo Shell раздел диалога Connect

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

Текст команды, который приходит из этого диалога, является длинным. Для ясности рассмотрим каждый из параметров в отдельности.

 mongo "mongodb://cluster0-shard-00-00-2ldwo.mongodb.net:27017,cluster0-shard-00-01-2ldwo.mongodb.net:27017,cluster0-shard-00-02-2ldwo.mongodb.net:27017/test?replicaSet=Cluster0-shard-0" --authenticationDatabase admin --ssl --username myadmin --password S$meComPLeX1! 

Первый параметр — это строка, содержащая список всех узлов в нашем кластере, включая определение набора реплик Cluster0-shard-0 . Следующий параметр, --authenticationDatabase сообщает нам, какая база данных содержит пользователя, которого мы хотим аутентифицировать.

--ssl соединение по протоколу SSL / TLS. Наконец, мы предоставляем имя пользователя и пароль, и мы на связи! Обратите внимание, что если вы не используете MongoDB Atlas, в вашем развертывании MongoDB может быть не включена защита или не требуется SSL. Таким образом, подключиться к нему можно так же просто, как набрать «mongo» в командной строке.

Теперь вы готовы использовать MongoDB!

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