Skip to main content

Podstawowa administracja bazą danych - mongosh

Wprowadzenie:

mongosh to interaktywna powłoka MongoDB oparta na JavaScripcie, służąca do administrowania serwerem i pracy z danymi. Zastąpiła starą powłokę mongo. Poniżej zebrano podstawowe komendy administracyjne — każda osobno, z opisem działania. Instrukcja zakłada pracę z hosta; jeśli serwer działa w kontenerze Docker, zobacz sekcję 1, która wyjaśnia jak „przetłumaczyć" każdą komendę uruchomieniową.

1. Dwa konteksty: baremetal vs kontener Docker

Sposób wejścia do powłoki zależy od tego, gdzie zainstalowany jest mongosh. Reszta komend (te zaczynające się od db. oraz show ...) wykonywana jest już wewnątrz powłoki i wygląda tak samo w obu przypadkach.

Baremetal — mongosh zainstalowany bezpośrednio na hoście:

mongosh

Docker — mongosh znajduje się w kontenerze (np. o nazwie mongo), więc komendę poprzedzamy wywołaniem docker exec:

docker exec -it mongo mongosh

Zasada przekładu: dowolną komendę mongosh ... z tej instrukcji można uruchomić w kontenerze, poprzedzając ją docker exec -it <nazwa_kontenera> (tryb interaktywny) lub samym docker exec <nazwa_kontenera> w przypadku jednolinijkowców --eval.

2. Komenda mongosh – uruchomienie powłoki

mongosh

Uruchamia interaktywną powłokę i łączy się z domyślnym serwerem (localhost:27017). Po połączeniu pojawia się znak zachęty, w który wpisuje się kolejne komendy.

Z uwierzytelnieniem (powłoka zapyta o hasło):

mongosh -u admin -p --authenticationDatabase admin

Opcja -u podaje użytkownika, -p bez wartości wymusza interaktywny monit o hasło (bezpieczniej niż wpisywanie go w linii poleceń), a --authenticationDatabase wskazuje bazę, w której zdefiniowano konto.

Pojedyncza komenda bez wchodzenia do powłoki (przydatne w skryptach):

mongosh --quiet --eval 'db.version()'

Opcja --eval wykonuje przekazany kod i kończy działanie; --quiet wycisza baner powitalny. W kontenerze: docker exec mongo mongosh --quiet --eval 'db.version()'.

Screen: ekran po udanym połączeniu z powłoką.

3. Komenda show dbs – lista baz danych

show dbs

Wyświetla listę wszystkich baz danych na serwerze wraz z ich rozmiarem na dysku. Bazy puste (bez zapisanych danych) mogą się nie pojawić na liście.

Przykład:

test> show dbs
admin   180.00 KiB
config   60.00 KiB
local    72.00 KiB

4. Komenda use – wybór bazy danych

use admin

Przełącza kontekst na wskazaną bazę. Od tego momentu zmienna db odnosi się do tej bazy. Jeśli baza nie istnieje, zostanie utworzona dopiero przy pierwszym zapisie danych.

5. Komenda db – bieżąca baza

db

Wyświetla nazwę bazy danych, na której aktualnie pracujemy. Pomaga zorientować się w kontekście przed wykonaniem operacji modyfikujących dane.

6. Komenda show collections – lista kolekcji

show collections

Wyświetla wszystkie kolekcje (odpowiednik tabel) w bieżącej bazie. Wymaga wcześniejszego wybrania bazy poleceniem use.

7. Komenda db.getUsers() – listowanie użytkowników

use admin
db.getUsers()

Wyświetla użytkowników zdefiniowanych w bieżącej bazie wraz z ich rolami. Konta administracyjne zwykle żyją w bazie admin, dlatego najpierw przełączamy się do niej poleceniem use admin.

Skrót shellowy (to samo działanie):

show users

Pełniejsze informacje o wszystkich kontach:

db.runCommand({ usersInfo: 1 })

Zwraca szczegółowy wykaz użytkowników bieżącej bazy w formie surowego dokumentu.

Screen: wynik db.getUsers() na bazie admin.

8. Komenda db.createUser() – tworzenie użytkownika

db.createUser({
  user: "backup",
  pwd: passwordPrompt(),
  roles: [ { role: "backup", db: "admin" } ]
})

Tworzy nowe konto w bieżącej bazie. Funkcja passwordPrompt() powoduje, że powłoka zapyta o hasło interaktywnie, zamiast zapisywać je w historii poleceń. Pole roles to lista par rola–baza określająca uprawnienia konta.

9. Komenda db.dropUser() – usuwanie użytkownika

db.dropUser("backup")

Usuwa wskazane konto z bieżącej bazy. Operacja jest nieodwracalna, dlatego należy upewnić się, że pracujemy na właściwej bazie (sprawdź poleceniem db).

10. Komendy db.grantRolesToUser() / db.revokeRolesFromUser() – zarządzanie rolami

db.grantRolesToUser("backup", [ { role: "readWrite", db: "appdb" } ])

Nadaje istniejącemu użytkownikowi dodatkową rolę na wskazanej bazie — tutaj prawo odczytu i zapisu w bazie appdb.

db.revokeRolesFromUser("backup", [ { role: "readWrite", db: "appdb" } ])

Odbiera wcześniej nadaną rolę. Składnia jest identyczna jak przy nadawaniu.

11. Komenda db.changeUserPassword() – zmiana hasła

db.changeUserPassword("backup", passwordPrompt())

Zmienia hasło istniejącego użytkownika. Ponownie warto użyć passwordPrompt(), aby nie ujawniać hasła w linii poleceń ani w historii.

12. Komenda db.getRoles() – przegląd ról

db.getRoles()

Wyświetla role zdefiniowane w bieżącej bazie. Oprócz ról własnych MongoDB udostępnia role wbudowane, których ta komenda standardowo nie pokazuje.

Typowe role wbudowane: read, readWrite, dbAdmin, userAdmin, dbOwner (na konkretnej bazie) oraz globalne readWriteAnyDatabase, userAdminAnyDatabase, backup, restore, root.

13. Komenda db.runCommand({ connectionStatus: 1 }) – kim jestem

db.runCommand({ connectionStatus: 1 })

Zwraca informacje o bieżącym połączeniu: zalogowanego użytkownika oraz przyznane mu role. Przydatne do szybkiej weryfikacji, czy uwierzytelnienie powiodło się i z jakimi uprawnieniami pracujemy.

14. Komenda db.stats() – statystyki bazy

db.stats()

Wyświetla statystyki bieżącej bazy: liczbę kolekcji, liczbę dokumentów oraz zajętość miejsca na dysku. Pomocne przy ocenie rozmiaru bazy przed wykonaniem kopii zapasowej.

Screen: wynik db.stats().

15. Komenda db.serverStatus() – status serwera

db.serverStatus()

Zwraca obszerny dokument z metrykami całego serwera: połączenia, zużycie pamięci, operacje, stan replikacji. Wynik jest bardzo duży, dlatego zwykle odczytuje się z niego pojedyncze pola, np. db.serverStatus().connections.

16. Komenda db.<kolekcja>.find() – wyszukiwanie dokumentów

db.uzytkownicy.find()

Wyświetla dokumenty z kolekcji. Bez argumentów zwraca wszystkie; w mongosh wyniki są domyślnie czytelnie sformatowane.

Z filtrem i operatorami porównań:

db.uzytkownicy.find({ wiek: { $gt: 25 } })           // wiek > 25
db.uzytkownicy.find({ wiek: { $gte: 18, $lt: 65 } }) // zakres
db.uzytkownicy.find({ imie: { $in: ["Anna", "Jan"] } })

Operatory $gt, $gte, $lt, $lte, $ne, $in pozwalają budować warunki bardziej złożone niż proste dopasowanie wartości.

Screen: przykładowy wynik find().

17. Komendy db.<kolekcja>.insertOne() / insertMany() – wstawianie

db.uzytkownicy.insertOne({ imie: "Anna", wiek: 30 })

Wstawia pojedynczy dokument do kolekcji. Jeśli kolekcja nie istnieje, zostanie utworzona automatycznie.

db.uzytkownicy.insertMany([
  { imie: "Jan", wiek: 41 },
  { imie: "Ola", wiek: 22 }
])

Wstawia wiele dokumentów jednocześnie, przekazanych jako tablica.

18. Komendy db.<kolekcja>.updateOne() / updateMany() – aktualizacja

db.uzytkownicy.updateOne(
  { imie: "Anna" },
  { $set: { wiek: 31 } }
)

Aktualizuje pierwszy dokument pasujący do filtra. Operator $set ustawia wartość pola; inne przydatne operatory to $inc (zwiększ), $unset (usuń pole), $push i $pull (operacje na tablicach).

db.uzytkownicy.updateMany(
  { wiek: { $lt: 18 } },
  { $set: { maloletni: true } }
)

Aktualizuje wszystkie dokumenty pasujące do filtra. Dodanie opcji { upsert: true } jako trzeciego argumentu sprawia, że dokument zostanie utworzony, jeśli żaden nie pasuje.

19. Komendy db.<kolekcja>.deleteOne() / deleteMany() – usuwanie

db.uzytkownicy.deleteOne({ imie: "Jan" })

Usuwa pierwszy dokument pasujący do filtra.

db.uzytkownicy.deleteMany({ wiek: { $lt: 18 } })

Usuwa wszystkie dokumenty pasujące do filtra. Pusty filtr {} usunąłby całą zawartość kolekcji, dlatego należy zachować ostrożność.

20. Komenda db.<kolekcja>.createIndex() – indeksy

db.uzytkownicy.createIndex({ imie: 1 })

Tworzy indeks na wskazanym polu (1 = rosnąco, -1 = malejąco), co przyspiesza wyszukiwanie po tym polu.

db.uzytkownicy.createIndex({ email: 1 }, { unique: true })

Tworzy indeks z wymuszeniem unikalności wartości w danym polu.

db.uzytkownicy.getIndexes()
db.uzytkownicy.dropIndex("imie_1")

Pierwsza komenda wypisuje istniejące indeksy kolekcji, druga usuwa indeks po jego nazwie.

Podsumowanie praktyczne

# Wejście do powłoki (baremetal)
mongosh -u admin -p --authenticationDatabase admin

# ...lub w kontenerze
docker exec -it mongo mongosh -u admin -p --authenticationDatabase admin
// Wewnątrz powłoki: rozeznanie i zarządzanie userami
show dbs
use admin
db.getUsers()
db.createUser({ user: "backup", pwd: passwordPrompt(), roles: [ { role: "backup", db: "admin" } ] })
db.runCommand({ connectionStatus: 1 })