mongodb - ghdrako/doc_snipets GitHub Wiki

Instalacja

mdir \data\db
mongod.exe --dbpath d:\test\mongodb\data

Connect client

mongosh
mongosh "mongodb://localhost:27017"
mongosh "mongodb+srv://mycluster.a123b.mongodb.net/test" --

Kolekcje

Insert

Dodanie do kolekcji me dokument address : {street : "Marszałkowska", city : "Warszawa"}:

db.me.insertOne(
{
	name : "Rafał",
	age : 35,
	address : {street : "Chłodna", city : "Warszawa"}
})

Delete

db.users.deleteOne({_id : 1})
db.users.deleteMany({name : "Ann"})
db.Users.deleteMany({})
db.Users.drop()

Count

db.Users.countDocuments()

Find

  • pobieranie "wszystkie" dokumenty - stremming danych - założony zostanie kursor i domyślnie dostaniemy 20 dokumentów iterująca sterownik będzie wysylal getMore(). Kazdy sterownik zapewnia mechanizm streemingu danych. Kursor nie jest izolowany - jesli dojda dokumenty to pojawiasie w kursorze. Klient mongodb opiera sie na sterowniku node.js. Find domyslnie streemuje dane za pomoca kursora. Jesli nieaktywnosc to kursor jest zamykany domyslnie po 10 minutach
db.me.find({})   # SELECT * FROM me;

Where

{ <field1>: <value1>, ... }

db.me.find({"age" : 30})  # select * from me where age = 30;

projekcja

db.<colection>.find(<where>,<projection>)
db.me.find({},{name : 1})  # domyślnie dorzuca tez id  select _id,name from me
db.me.find({},{name : 1, _id : 0}) # wymuszamy by nie zwrócił id select name from me
db.me.find({}, {name : 0})    # wszystkie pola oprocz name
db.me.find({"name" : "Artur"}).sort("age")  # sortowanie select * from me order by age;
db.me.find({"name" : "Artur"}).skip(10) 
db.me.find({"name" : "Artur"}).limit(10) # select * from me limit 10

Filtrowania - selektory zapytań $ne $gt $gte $lt $in $nin


Regex

Warunki logiczne $and $or $exist

db.me.find({"filed" : {$exist : 1}})
db.me.find({"filed" : {$exist : 0}})

findOne - zwraca pojedynczy losowy dokument spełniający filtr nie tworząc kursora

elemMatch

db.products.find({},($elemMatch : {"warehouses : {qty : {$lt : 10}}}})

$unset

Zmiana nazwy pola

db.me.updateMany({},{$unset : { "name" : "imie"}}) # zmiana nazwy - obsługa polskich znaków
db.me.updateMany({},{$unset : { "age" : ""}}) # usuniecie pola

Agregacje - Agregation Pipeline

  • wzorowana na operatorze | w linux - pipeline
  • definiujemy pipeline przez który przejdą nasze dane (kolekcja)
kolekcja ---> filtr ---> projekcja ---> grupowania ---> filtrowania ---> out ---> kolekcja 2

Każdy z etapów może występować dowolna ilość razy - tutaj np. 2 razy filtrowanie

db.

.agregate i dalej kroki
  • operator $match - taki sam jak find
{ $match : {query}}


db.movies.aggregate(
    [ {$match : {directed_by: "George Lucas"}}]
    )

to samo co

db.movies.find({directed_by: "George Lucas"})
  • operator $sort
db.movies.aggregate(
    [ {$match : {directed_by: "George Lucas"}}, 
      {$sort : {vote_average : -1}}  // sortowanie malejaco -1
    ]
    )
  • operator $limit

  • Operator $project

db.movies.aggregate(
    [ {$match : {directed_by: "George Lucas"}}, 
      {$sort : {vote_average : -1}},
      {$project : {title : 1}}
    ]
    )
  • Tworzenie nowego pola zysk jako roznica
db.movies.aggregate(
    [ {$match : {directed_by: "George Lucas"}}, 
      {$sort : {vote_average : -1}}, 
      {$project : {zysk : {$subtract : ["$revenue.Amount" , "$budget.Amount"]}}}
 
    ]
    )
  • operator $addFields - dodanie pola do dokumentu

  • $arrayElemAt ; {, index] - zwraca wybrany element tablicy

  • $group grupowanie - dziala opytmalizator - czmienia kolejnosc lub scala kroki - wszystkie operacje

db.movies.aggregate(
[
  {$group : 
      {
          _id : "$genres",
          liczbaFilmow : {$count : {}}
      }
  },
  {$sort : {liczbaFilmow : -1}}
]    
  • $unwind - rozpakowanie tablicy - np rozbicie tablicy gatunkow
db.movies.aggregate(
[{$unwind : "$genres"}]
)

Kazdy film nalezacy do tablicy gatunków - zostal rozbity na wiele filmow po kazdym gatunku

  • facet - bucketowanie

  • $lookup - pseudo left join - doczytywanie danych - jedyny sposb na joinowanie w ramach jednej bazy danych

    • wersja z rownoscia
    • wersja z podagregacja - w sql join z podselectem - podwojny $ tu wystepuje (jeszcze $$ jest w aggrArray) W sharding problem z looupem jest duzy ruch miedzy serwerami - dlatego laczenie dziala dosc wolno
  • $out - zrzucanie wyniku dop kolekcji

{$out : "<nawa_nowej_kolekcji"}

Mongo ma mechanizmy aby nie pozwolić zabić bazy pojedynczym zapytaniem - odpowiednio zwalnia i limituje pamięć

wersja 4.4 przestanie byc utrzymywana do konca roku. W wersji 6 działają lepiej transakcje i lepiej dzisla kompresja na zascd. Migracja - mongo udostępnia log migracji

Domyślnie napisuje dane w kolekcji. Jezelich chcemy dopisac operator $merge. Druga ocja sa widoki które nie utrwalaja dane

Pobranie MongoDb Tools

mongoimport --db test --collection movies --jsonArray --drop movies.json
./mongoimport --db test --collection movies --jsonArray --drop movies.json
  • --jsonArray - to nie sa pojedyncze jsony tylko tablica jsonow
  • --drop - kolekcja przed zaimportowaniem bedzie dropowana

Inne mongostat - statystyki

Narzedzia do przegladania

  • noSqlBooster - darmowe z ograniczeniami - najprostrzy w instalacji
  • Robo3T -- nie rozwijany opensource darmowy (wykupilo Studio3T i zamknelo)
  • Studio3T - darmowe z ograniczeniami
  • Compass - darmowy ale ubogi
  • Vs Code + plugin MongoDB

Monitorowanie MongodB

Narzędzia do Percona - można wpiąć Nagiosa i Zabix-a

Buckup MongoDB

Percona open source - tylko linux Na windowsa tylko mongodump

MongoDB university - szkolenia

Skalowanie

  • Replikacja - kopia online (lag 1ms) - tryb master - slave (w mongo nazywane primary -secendary) Tylko jeden serwer master (primary) i tylko do tego serwera trafiają operacje zapisu. Przy awarii zadziała mechanizm elekcji. Da się wymusić ze odczyt tylko z secondary, potwierdzanie zapisów przez secendary wc=0 (domyślną konfiguracja pod benchmarki ale gubiły zapsy) - dane ginęły zmienić wc=1. Aktualnie w 4.4 jest wc=1 (zapis potwierdzany na jeden serwer) a od 6 jest wc większościowy - czyli liczba węzłów/2+1

Daje backup, patchowanie bezpieczne ,transakcje(wymaga replikacji - można oszukać ), elekcje w awarii.

  • Sharding
    • na samym szczycie jest query rooter - mongos - zapewnia przekierowanie zapytania i złączenie wyników z poszczególnych shard-ow - moze byc kilka mongosowe aby byc odpornym na awarie
    • wydajność bez shardingu to około 15 000IO/s na middle range serwer
    • można dołożyć do shardu replica sety
    • już może być więcej niż 20 węzłów

Backup z logu tranzakcyjnego i backup

Full backup tylko z Query Router

Backup nie lubi się z transakcyjnością - moze byc buckup niespojny

Z boku czuwa nadzorca procesu - w ramach procesu config serwera - odpowiada za przechowywania informacji gdzie i jakie dane sie znajduja i przenoszenie fragmentu danych. Synchronizacja przez config serwer. Query rutery ciagna konfiguracje z config serwerow.

Tryby

  • auto split auto balance - sam mongo rozdziela
  • manual ręcznie sh.splitAt sh,moveChank
  • strefy - zakresy kluczy przypisane do serwerów

Autoryzacja

Na start utworzyc uzytkownika - tworzymy userow przypisanych do bazy danych. Ta baza danych moze stanowic przelotke do bazxy test. Baza admin bedzie tylko do administracji i da uprawnienia do innych baz danych. Alemoze sie autoryzowac w bazie test i dostac calkiem inne uprawnienia niz z bazy admin

use admin
db.createUser

Role: adminAnyDB Sa wbudowane role jak i mozna stworzxyc wlasna role

  • --auth - flaga wlaczenie autoryzacji przy starcie bazy danych

logowanie

mongosh -u admin -p admin123

db.users.find()

bind.ip.all

⚠️ **GitHub.com Fallback** ⚠️