Раздел 36 · MongoDB с нуля

Первые команды в mongosh

junior~15 мин

без входаВойди, чтобы отмечать прогресс, вести заметки и решать задачи в редакторе. войти

В прошлом уроке мы запустили сервер и увидели приглашение test>. Теперь учимся с ним разговаривать. Команд для начала нужно совсем немного: узнать, где ты, переключиться на нужную базу, положить документ, найти его и посчитать. Заодно выясним главную особенность mongosh: это не отдельный язык запросов, а JavaScript.

Пульт, который понимает JavaScript

В psql было два языка: SQL для данных и команды с обратной косой чертой для самого клиента. В mongosh язык один, и это JavaScript. Запрос к базе выглядит как вызов метода у объекта:

db.books.find()

Читается справа налево по смыслу и слева направо по записи: в текущей базе db возьми коллекцию books и вызови у неё метод find. Ни точки с запятой, ни отдельного синтаксиса: обычный вызов функции.

Рядом живут несколько команд в стиле старой оболочки, без скобок: use, show dbs, show collections. Это исключения, их немного.

Где я и что тут есть

show dbs показывает базы на сервере и сколько они занимают:

admin    8.00 KiB
config  12.00 KiB
local    8.00 KiB
shop    16.00 KiB

Базы admin, config и local служебные, их не трогаем. Базу, в которой ты работаешь, видно в приглашении. Узнать её имя можно и командой db.getName().

use переключает на другую базу:

test> use library
switched to db library
library>

Базы library ещё нет, и mongosh не возражает. Как мы знаем из урока про коллекции, база появится при первой записи. Пока в ней пусто, show dbs её не покажет.

show collections перечисляет коллекции текущей базы. Сейчас список пуст, ответом будет пустая строка.

Положить и найти

Кладём две книги в коллекцию books методом insertOne:

db.books.insertOne({ title: 'Шинель', author: 'Гоголь', pages: 64 })
db.books.insertOne({ title: 'Нос', author: 'Гоголь', pages: 48, year: 1836 })
{
  acknowledged: true,
  insertedId: ObjectId('6ac9371af0f4c63b0a775dfa')
}

acknowledged: true значит, что сервер принял запись, а insertedId это идентификатор нового документа. У тебя он будет другим. Подробно про вставку поговорим в пятом уроке.

find() без аргументов возвращает все документы коллекции:

db.books.find()
[
  {
    _id: ObjectId('6ac9371af0f4c63b0a775dfa'),
    title: 'Шинель',
    author: 'Гоголь',
    pages: 64
  },
  {
    _id: ObjectId('6ac9371af0f4c63b0a775dfb'),
    title: 'Нос',
    author: 'Гоголь',
    pages: 48,
    year: 1836
  }
]

Чтобы найти конкретные документы, передай в find образец: документ с полями, которые должны совпасть. Образец называют фильтром:

db.books.find({ author: 'Гоголь' })

Это аналог SELECT * FROM books WHERE author = 'Гоголь'. findOne возвращает первый подходящий документ, а не список:

db.books.findOne({ title: 'Нос' })
{
  _id: ObjectId('6ac9371af0f4c63b0a775dfb'),
  title: 'Нос',
  author: 'Гоголь',
  pages: 48,
  year: 1836
}

Если ничего не нашлось, findOne вернёт null, а find пустой список. Посчитать документы помогает countDocuments:

db.books.countDocuments()
2

урок из курса

Урок из курса «MongoDB с нуля». Курс покупается один раз и остаётся навсегда: 500 ₽.

Оплата пока не подключена: премиум и курсы открываются промокодом.