Ответ
MongoDB — документоориентированная NoSQL БД, которая хранит данные в виде гибких JSON-подобных документов (BSON).
Ключевые особенности:
- Гибкая схема: Документы в одной коллекции могут иметь разную структуру, что ускоряет разработку.
- Масштабируемость: Поддержка горизонтального масштабирования через шардирование (автоматическое распределение данных по кластеру).
- Мощный язык запросов: Поддержка сложных запросов, агрегаций (аналог GROUP BY + JOIN), геопространственных индексов и полнотекстового поиска.
- Высокая производительность на операциях записи/чтения за счёт внутреннего устройства и использования оперативной памяти.
Типичные операции (Java Driver):
// Подключение
MongoClient client = MongoClients.create("mongodb://localhost:27017");
MongoDatabase database = client.getDatabase("ecommerce");
MongoCollection<Document> products = database.getCollection("products");
// Вставка документа
Document newProduct = new Document("name", "Laptop")
.append("price", 999.99)
.append("tags", Arrays.asList("electronics", "portable"))
.append("stock", new Document("warehouse", "A").append("qty", 50));
products.insertOne(newProduct);
// Поиск с фильтром
Document query = new Document("price", new Document("$lt", 1000));
FindIterable<Document> affordableProducts = products.find(query);
// Агрегация (подсчёт среднего цены по категориям)
List<Document> pipeline = Arrays.asList(
new Document("$group",
new Document("_id", "$category")
.append("avgPrice", new Document("$avg", "$price"))
)
);
products.aggregate(pipeline).forEach(System.out::println);
| Плюсы и минусы: | Плюсы | Минусы |
|---|---|---|
| Быстрая разработка при изменяющихся требованиях. | Отсутствие JOIN (требует денормализации или нескольких запросов). | |
| Отличная производительность для больших объёмов данных и высокой нагрузки. | Транзакции (хотя поддерживаются в последних версиях) могут быть менее эффективны, чем в реляционных БД. | |
| Удобна для иерархических и неструктурированных данных. | Потребление памяти из-за дублирования данных при денормализации. |
Сценарии использования: Каталоги продуктов с переменными атрибутами, системы сбора логов и событий, контент-менеджмент системы (CMS), мобильные бэкенды, профили пользователей.