# 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:

```bash
mongosh
```

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

```bash
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

```bash
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):

```bash
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):

```bash
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()'`.

<p class="callout info">**Screen:** ekran po udanym połączeniu z powłoką.</p>

## 3. Komenda `show dbs` – lista baz danych

```javascript
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

```javascript
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

```javascript
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

```javascript
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

```javascript
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):

```javascript
show users
```

**Pełniejsze informacje o wszystkich kontach:**

```javascript
db.runCommand({ usersInfo: 1 })
```

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

<p class="callout info">**Screen:** wynik `db.getUsers()` na bazie admin.</p>

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

```javascript
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

```javascript
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

```javascript
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`.

```javascript
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

```javascript
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

```javascript
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.

<p class="callout warning">**Typowe role wbudowane:** `read`, `readWrite`, `dbAdmin`, `userAdmin`, `dbOwner` (na konkretnej bazie) oraz globalne `readWriteAnyDatabase`, `userAdminAnyDatabase`, `backup`, `restore`, `root`.</p>

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

```javascript
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

```javascript
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.

<p class="callout info">**Screen:** wynik `db.stats()`.</p>

## 15. Komenda `db.serverStatus()` – status serwera

```javascript
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

```javascript
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ń:**

```javascript
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.

<p class="callout info">**Screen:** przykładowy wynik `find()`.</p>

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

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

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

```javascript
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

```javascript
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).

```javascript
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

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

Usuwa pierwszy dokument pasujący do filtra.

```javascript
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

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

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

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

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

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

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

## Podsumowanie praktyczne

```bash
# 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
```

```javascript
// 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 })
```