Працюємо з MongoDB в Python
MongoDB - це нереляційна, документно-орієнтована база даних. Якщо проводити паралелі зі звичайними базами даних (MySQL і т.д.), то маємо таку термінологію:
База даних (теж база даних) - структорований, впорядкований набір даних, які ви хочете зберігати.
Колекція (таблиця) - набір пов’язаних між собою за певним критерієм даних. База даних складається з колекцій.
Документ (рядок/запис в таблиці) - структурна одиниця даних; документи об’єднуються в колекції. Документи зберігаються у JSON-подібному вигляді (а саме BSON, якщо говорити про використання зі стандартними структурами пайтона). Структура: набір полів і відповідних значень для них.
Перевагами монго є: відновлення після збоїв, автоматичне масштабування, підтримка динамічної структури документів (немає жорсткої прив’язки до наперед визначеної схеми), вбудовані документи і масиви як альтернатива складним join-ам, і документи, які є аналогами стандартних структур даних в багатьох мовах програмування (dict в пайтоні). Досить теорії - працюємо з монго за допомогою клієнта PyMongo.
Для початку завантажуємо/встановлюємо/запускаємо монго або використовуємо отримані незаконним шляхом реквізити доступу до віддаленого серверу. Піп-піп
1 | $ pip install pymongo |
Підключаємось
1 | from pymongo import MongoClient |
Один клієнт може працювати одразу з декількома (всіма) базами даних. Щоб вибрати потрібно базу можна використовувати доступ по атрибуту через крапку або словник-подібну нотацію
1 | db = client.posts_db |
Працюємо з документами
1 | db = client.posts_db # database |
Можна додавати один або одразу декільки елементів масивом. При додаванні кожного елемента документу присвоюється спеціальне поле _id
, унікальне для колекції. Якщо у вас є це поле у текстовому вигляді, то знайти відповідний документ можна так:
1 | from bson.objectid import ObjectId |
Оновлюємо необхідний документ і рахуємо кількість всіх записів в колекції
1 | posts.update({'_id': post_id}, {'$set': {'text': 'Updated text'}}, upsert=False) |
Додати унікальний запис до масиву, наприклад оновити теги до запису, щоб не було повторів
1 | posts.update({'_id': post_id}, {'$addToSet': {'tags': 'mongo'}}) |
Буде доданий лише другий тег.
І наостанок: вибрати випадковий документ з колекції. Для цієї достатньо необхідної задачі існує багато рішень, ось одне з не дуже складних
1 | import random |
Увага! Остання версія PyMongo на момент написання статті - 3.0, використана тут - 2.6. Назви деяких методів чи їх поведінка могла змінитися, тому при виникненні помилок звертайтесь до документації. Встановити конкретну версію можна явно вказавши це в pip
1 | $ pip install pymongo==2.6.3 |