← Назад к вопросам

Какой уровень знания в MongoDB?

1.3 Junior🔥 111 комментариев
#Soft skills и опыт работы#Базы данных и SQL

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Мой опыт с MongoDB

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

Уровень компетенции: Middle-Senior

Я работал с MongoDB на production приложениях, обрабатывающих миллионы документов, и имею глубокое понимание её архитектуры.

Основные операции

1. Подключение и базовые операции

const MongoClient = require('mongodb').MongoClient;

const client = new MongoClient('mongodb://localhost:27017');

async function connect() {
  await client.connect();
  const db = client.db('myapp');
  const collection = db.collection('users');
  
  // Create (Insert)
  const result = await collection.insertOne({
    name: 'John',
    email: 'john@example.com',
    age: 30
  });
  
  // Read (Find)
  const user = await collection.findOne({ email: 'john@example.com' });
  const users = await collection.find({ age: { $gt: 25 } }).toArray();
  
  // Update
  await collection.updateOne(
    { _id: user._id },
    { $set: { age: 31 } }
  );
  
  // Delete
  await collection.deleteOne({ _id: user._id });
}

2. Сложные запросы и фильтры

// Поиск с множественными условиями
db.collection('users').find({
  age: { $gte: 25, $lte: 35 },
  status: { $in: ['active', 'premium'] },
  tags: { $all: ['developer', 'nodejs'] }
}).toArray();

// Регулярные выражения
db.collection('users').find({
  email: { $regex: '^admin@' }
}).toArray();

// Поиск по массивам
db.collection('posts').find({
  'comments.authorId': 'user123'
}).toArray();

// Поиск по вложенным полям
db.collection('users').find({
  'profile.location.country': 'USA'
}).toArray();

3. Aggregation Pipeline (мощный инструмент)

// Группировка, сортировка, трансформация
db.collection('orders').aggregate([
  // Фильтр
  { $match: { status: 'completed', createdAt: { $gte: new Date('2024-01-01') } } },
  
  // Группировка
  { 
    $group: {
      _id: '$userId',
      totalAmount: { $sum: '$amount' },
      orderCount: { $sum: 1 },
      avgAmount: { $avg: '$amount' }
    }
  },
  
  // Сортировка
  { $sort: { totalAmount: -1 } },
  
  // Лимит
  { $limit: 10 },
  
  // Lookup (аналог JOIN)
  {
    $lookup: {
      from: 'users',
      localField: '_id',
      foreignField: '_id',
      as: 'user'
    }
  },
  
  // Проекция
  {
    $project: {
      _id: 0,
      userId: '$_id',
      totalAmount: 1,
      orderCount: 1,
      user: { $arrayElemAt: ['$user', 0] }
    }
  }
]).toArray();

Индексирование

Критично для производительности:

// Создание индексов
db.collection('users').createIndex({ email: 1 });
db.collection('users').createIndex({ name: 1, age: -1 });

// Уникальный индекс
db.collection('users').createIndex({ email: 1 }, { unique: true });

// Text index для полнотекстового поиска
db.collection('posts').createIndex({ title: 'text', content: 'text' });
db.collection('posts').find({ $text: { $search: 'nodejs' } });

// Compound индекс (часто нужен)
db.collection('orders').createIndex({ 
  userId: 1, 
  createdAt: -1 
});

// TTL индекс (автоматическое удаление)
db.collection('sessions').createIndex(
  { createdAt: 1 },
  { expireAfterSeconds: 86400 }  // Удалить через 24 часа
);

// Просмотр индексов
db.collection('users').getIndexes();

// Удаление индекса
db.collection('users').dropIndex('email_1');

// Анализ запросов
db.collection('users').find({ email: 'test@example.com' }).explain('executionStats');

Транзакции

Для ACID гарантий (MongoDB 4.0+):

const session = client.startSession();

try {
  await session.withTransaction(async () => {
    const usersCollection = db.collection('users');
    const accountsCollection = db.collection('accounts');
    
    // Все операции либо применяются, либо откатываются
    await usersCollection.updateOne(
      { _id: userId },
      { $set: { balance: newBalance } },
      { session }
    );
    
    await accountsCollection.insertOne(
      { userId, type: 'transfer', amount },
      { session }
    );
  });
} finally {
  await session.endSession();
}

Инструменты и лучшие практики

Mongoose (ODM для MongoDB)

const schema = new Schema({
  name: { type: String, required: true },
  email: { type: String, unique: true },
  age: { type: Number, min: 0 },
  createdAt: { type: Date, default: Date.now }
});

const User = mongoose.model('User', schema);

const user = new User({ name: 'John', email: 'john@example.com' });
await user.save();

MongoDB Compass — визуальный клиент (очень удобный)

mongodump / mongorestore — backup и restore:

mongodump --db mydb --out ./backup
mongorestore --db mydb ./backup/mydb

Производительность: что я знаю

1. N+1 проблема

// Плохо
const users = await db.collection('users').find({}).toArray();
for (const user of users) {
  const posts = await db.collection('posts').find({ userId: user._id }).toArray();
}

// Хорошо — Aggregation Pipeline
db.collection('users').aggregate([
  {
    $lookup: {
      from: 'posts',
      localField: '_id',
      foreignField: 'userId',
      as: 'posts'
    }
  }
]).toArray();

2. Памятный лимит в aggregation

  • MongoDB держит промежуточные результаты в памяти
  • $limit раньше $sort для экономии памяти
  • Использовать $project для удаления ненужных полей

3. Sharding

  • Когда одна машина не может вместить все данные
  • Выбор правильного shard key — критично
  • Uneven распределение = горячие шарды

Когда использовать MongoDB

Хорошо для:

  • Неструктурированные данные (JSON)
  • Быстрое прототипирование
  • Данные с разной структурой (мобильные, разные версии API)
  • High-write volume (много вставок)
  • Горизонтальное масштабирование

Плохо для:

  • Сложные отношения между данными (использовать PostgreSQL)
  • ACID требования (хотя MongoDB 4.0+ имеет транзакции)
  • Сложные аналитики (использовать ClickHouse, Redshift)
  • Когда важна консистентность (PostgreSQL лучше)

Мой опыт на production

Я использовал MongoDB в:

  • Социальных сетях (миллионы документов)
  • Chat приложениях (высокий write volume)
  • Real-time analytics (гибкая схема)
  • IoT системах (разноформатные данные)

Основные проблемы, которые решал:

  1. Индексирование — неправильные индексы = медленные запросы
  2. Размер документа — BSON лимит 16MB
  3. Memory usage — aggregation может использовать слишком много памяти
  4. Connections — пулинг соединений критичен

На продакшене лучше практикуют

  1. Всегда используй индексы для search полей
  2. Не делай N+1 запросов — используй aggregation
  3. Лимитируй результаты при больших запросах
  4. Используй projection для удаления ненужных полей
  5. Мониторь production queries через MongoDB profiler
  6. Создай backup strategy — mongodump или реплика-сеты
  7. Используй транзакции для критичных операций

Вывод

Мой уровень: Upper-Middle / Senior. Я знаю:

  • Все основные операции
  • Aggregation Pipeline на глубоком уровне
  • Оптимизацию запросов и индексирование
  • Разворачивание и поддержку на production
  • Транзакции и ACID гарантии

Что я бы улучшил:

  • Глубже в Sharding стратегиях
  • Более опытен в управлении большими кластерами
  • Есть области, которые не трогал (geo queries, full-text search в MongoDB)