mongodb - ghdrako/doc_snipets GitHub Wiki
- https://www.mongodb.com/try/download/community
- https://www.mongodb.com/try/download/shell Start serwer
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" --
Dodanie do kolekcji me dokument address : {street : "Marszałkowska", city : "Warszawa"}
:
db.me.insertOne(
{
name : "Rafał",
age : 35,
address : {street : "Chłodna", city : "Warszawa"}
})
db.users.deleteOne({_id : 1})
db.users.deleteMany({name : "Ann"})
db.Users.deleteMany({})
db.Users.drop()
db.Users.countDocuments()
- 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;
{ <field1>: <value1>, ... }
db.me.find({"age" : 30}) # select * from me where age = 30;
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
db.me.find({"filed" : {$exist : 1}})
db.me.find({"filed" : {$exist : 0}})
db.products.find({},($elemMatch : {"warehouses : {qty : {$lt : 10}}}})
Zmiana nazwy pola
db.me.updateMany({},{$unset : { "name" : "imie"}}) # zmiana nazwy - obsługa polskich znaków
db.me.updateMany({},{$unset : { "age" : ""}}) # usuniecie pola
- 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
- https://www.mongodb.com/try/download/database-tools
- https://github.com/rkaszczuk/MongoCourse/raw/master/0_Movies_Data/moviesBackup.zip
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
- 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
Narzędzia do Percona - można wpiąć Nagiosa i Zabix-a
Percona open source - tylko linux Na windowsa tylko mongodump
MongoDB university - szkolenia
- 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
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