🍃 MongoDB

Документы, коллекции, CRUD, фильтры, агрегации, индексы и mongosh.

Шпаргалки · Данные · #mongodb #nosql #documents

Подключение (mongosh)

mongosh "mongodb://localhost:27017/mydb"
show dbs; use mydb; show collections

Понятия

Термин Аналог в SQL
Database база
Collection таблица
Document (BSON) строка
_id первичный ключ (ObjectId)

CRUD

db.users.insertOne({ name: "Аня", age: 30, tags: ["a", "b"] })
db.users.insertMany([{ name: "Борис" }, { name: "Вера" }])

db.users.find({ age: { $gte: 18 } }, { name: 1, _id: 0 }).sort({ age: -1 }).limit(10)
db.users.findOne({ name: "Аня" })

db.users.updateOne({ name: "Аня" }, { $set: { age: 31 }, $inc: { visits: 1 } })
db.users.updateMany({}, { $unset: { tmp: "" } })
db.users.replaceOne({ _id: id }, { name: "Новая" })

db.users.deleteOne({ name: "Борис" })
db.users.deleteMany({ age: { $lt: 18 } })
db.users.countDocuments({ age: { $gt: 20 } })

Операторы

Группа Операторы
Сравнение $eq $ne $gt $gte $lt $lte $in $nin
Логика $and $or $not $nor
Элемент $exists $type
Массивы $all $elemMatch $size
Обновление $set $unset $inc $push $pull $addToSet $rename
Текст и регулярки $regex, $text

Агрегации

db.orders.aggregate([
  { $match: { status: "paid" } },
  { $group: { _id: "$userId", total: { $sum: "$amount" }, n: { $sum: 1 } } },
  { $sort: { total: -1 } },
  { $limit: 5 },
  { $lookup: { from: "users", localField: "_id", foreignField: "_id", as: "user" } }
])

Этапы: $match, $group, $project, $sort, $limit, $skip, $unwind, $lookup (аналог JOIN), $addFields.

Индексы

db.users.createIndex({ email: 1 }, { unique: true })
db.users.createIndex({ city: 1, age: -1 })
db.users.getIndexes()
db.users.find({ email: "a@x.ru" }).explain("executionStats")

Приёмы

  • Данные, которые читаются вместе, храните в одном документе (встраивание); для связей «один ко многим» с большим числом связанных записей используйте ссылки.
  • Транзакции с несколькими документами: session.withTransaction(...) (нужен replica set).
  • Резервные копии: mongodump / mongorestore.