NoSQL i MongoDB Wstęp
MongoDB Nierelacyjna baza danych Brak schematów Zapis w oparciu o kolekcje i dokumenty (naturalny zapis danych) Duże wsparcie w wielu językach i bibliotekach (ODM) Zapytania oparte o składnie ES i JSON Wsparcie dla Geospatial Queries (odległość, zawieranie się) Przechowuje dane w formacie BSON (binarny JSON) Szerokie zastosowania (praktycznie każda baza SQL może być zastąpiona MongoDB) Skalowalność (auto-sharding), replikowalność https://www.mongodb.com/mongodb-scale Bardzo łagodna krzywa nauki (Learning curve)
Narzędzia Serwer Klient MongoDB Community Server – instalowany lokalnie https://mlab.com/ - Database-as-a-Service https://cloud.mongodb.com – chmura Klient MogoDB shell – konsola MongoDB Compass – oficjalny klient GUI (darmowy) Robo 3T – prosty i intuicyjny (darmowy) Studio 3T – rozbudowany IDE (darmowy dla studentów) Mongo Management Studio (darmowy i płatny) Nosqlclient – webowy (darmowy) Wbudowane w środowisko (np. Mongo Explorer w Webstorm)
Serwer lokalny Nie wymaga logowania, dobry do tworzenia oprogramowania https://www.mongodb.com/download-center/community Usługa systemowa lub uruchamiany z linii poleceń: "c:\Program Files\MongoDB\Server\4.0\bin\mongod.exe" --dbpath=e:\MongoDB\ Stwórz kopie bazy danych mongodump --db myDatabase Przywróć kopie bazy danych Przywraca baze z katalogu backup_db do bazy myDatabase --drop – usuwa istniejącą bazę jeśli istnieje (w przeciwnym wypadku kolekcje zostaną połączone) mongorestore.exe backup_db --db myDatabase --drop
Zapytania Wyświetl bazy danych show dbs Stwórz lub użyj bazy danych use ie2018 Stwórz kolekcję db.createCollection("mojaKolekcja") Wyświetl kolekcje: db.getCollectionNames() Usuń kolekcje: db.mojaKolekcja.drop()
Zapytania Dodaj dokument do kolekcji db.mojaKolekcja.insert({ manufacturer: "Opel", model: "Corsa", year: 2015, damaged: true }) Znajdź wszystkie dokumenty w kolekcji db.mojaKolekcja.find() Usuń dokument db.mojaKolekcja.remove({_id: ObjectId("5be45a5030c2f96f5fb48cab")})
Indeksy Dodaj nowy index db.mojaKolekcja.createIndex({"name" : 1}) Każda kolekcja ma domyślny niusuwalny index na polu _id które musi być unikalny. _id jest polem typu ObjectID (12 bajtowa wartość przechowuje wartość o timestamp, licznik, oraz losową liczbę) Dodaj nowy index db.mojaKolekcja.createIndex({"name" : 1}) Dodaj nowy unikalny index db.mojaKolekcja.createIndex({"name" : 1}, {"unique": true}) Dodaj nowy index z czasem wygaśnięcia (po tym czasie dokument zostanie usunięty) db.mojaKolekcja.createIndex({"expireAt" : 1}, {"expireAfterSeconds": 3600}) Wyświetl indeksy db.manufacturer.getIndexes() Usuń index db.manufacturer.dropIndex( {"expireAt": 1} )
Dokumenty Dokumenty z tablicami i dokumentami zagnieżdżonymi (wbudowanymi) db.mojaKolekcja.insert({ manufacturer: "Opel", model: "Meriva", year: 2015, doors: [2,4], dimensions: { _id: new ObjectId(), length: 3622, width: 1532, height: 1360 } })
Relacje Dokumenty z referencją db.mojaKolekcja.insert({ manufacturer: "Opel", model: "Meriva", year: 2015, engine: ObjectId("5be45cb730c2f96f5fb48cac") }) Referencje stosujemy gdy planujemy odpytywać różne kolekcje z osoba lub potrzebujemy relację jeden do wielu Dokumenty zagnieżdżone stosujemy dla danych nie mających sensu bez kontekstu (np. komentarz do artykułu) Można przeszukiwać dokumenty zagnieżdżone Referencje i dokumenty zagnieżdżone mogą być umieszczane w tablicach
Operacja na tablicach db.mojaKolekcja.update({ _id: ObjectId("5be45cb730c2f96f5fb48cac") }, { $push: { doors: 5 } }) $pop: { doors: -1 } - usuwa pierwszy (-1) lub ostatni (1) $pull: { doors : { $gte: 3 } } } - usuwa wszystkie spełanijące warunek $set: {"doors.0" : 2 }} - zmienia element o zadanym indeksie (0) na podaną wartość
Manufacturer Carmodel
Zapytania Znajdź wszystkie: find Znajdź jeden: findOne Znajdź jeden i wykonaj operację: findOneAndDelete, findOneAndReplace, findOneAndUpdate Znajdź dokument przez ID: db.carmodel.findOne("5be46e49d4e0a9a0c76b7ebd") Znajdź dokumenty których pole ma określoną wartość: db.carmodel.find({year: 1994}) Znajdź dokumenty których pole spełnia warunki: db.carmodel.find({year: {$gt: 1990}}) $gt, $gte, $eq, $ne, $lt, $lte Znajdź dokumenty z tablicą zawierającą: db.carmodel.find({doors: {$in: [2,4]}})
Zapytania Znajdź dokument i dodaj pole: Znajdź dokument i usuń pole: update – wykonuje atomową aktualizację dla jednego lub więcej dokumentów pasujących do zapytania. Zwraca ilość zmodyfikowanych dokumentów findOneAndUpdate - Wykonuje aktualizację dla jednego dokumentu i zwraca jego zawartość. Domyślnie zwraca dokument sprzed modyfikacji, chyba, że opcja "returnNewDocument" ma wartość prawda Znajdź dokument i dodaj pole: db.manufacturer.findOneAndUpdate({ name: "Fiat" }, { $set: { favourite: true } }) Znajdź dokument i usuń pole: $unset: { favourite: "" }, { returnNewDocument: true
Zapytania Znajdź dokument zawierający w osadzonym dokumencie pole spełniające warunek: db.carmodel.find({"dimensions.length" : { $gt : 4000 }}) Znajdź dokumenty spełniające wszystkie warunki: db.carmodel.find({ $and: [{ year: { $gt: 2000 } }, { doors: { $size: 1 } } ] }) Znajdź dokumenty spełniające choć jeden warunek: $or: [{ year: { $gt: 2000 } doors: { $size: 4 }
Zapytania Znajdź dokumenty i posortuj względem pola: db.carmodel.find({}).sort({year: -1}) -1 – malejąco 1 – rosnocą Znajdź dokumenty pomiń n pierwszych i wyświetl m (paginacja): db.carmodel.find({}).skip(10).limit(10) Zlicz dokumenty db.carmodel.find({}).count() Znajdź dokumenty pasujące do wyrażenia regularnego db.manufacturer.find({name: {$regex: "op.*", $options: "$i"}})
Aggregation framework Aggregation framework przetwarza dane w potoku i zwraca obliczony wynik $group – Groups documents by some specified expression and outputs to the next stage a document for each distinct grouping. The output documents contain an _id field which contains the distinct group by key db.manufacturer.aggregate([ { "$group" : { _id: "$origin", companies: { $push: "$name" } } ]) db.manufacturer.aggregate([ { "$group" : { _id: null, youngest: {$min: "$founded"}, oldest: {$max: "$founded"} } ])
Aggregation framework $project - Passes along the documents with the requested fields to the next stage in the pipeline. db.manufacturer.aggregate([ { "$project" : { old: { $subtract: [new Date().getFullYear(), "$founded"] } } ])
Aggregation framework $lookup - Performs a left outer join to a collection to filter in documents from the “joined” collection for processing. $match - Filters the documents to pass only the documents that match the specified condition(s) to the next pipeline stage. db.carmodel.aggregate([{ "$lookup": { from: "manufacturer", localField: "manufacturer", foreignField: "_id", as: "manufacturerInfo" } }, { $match : { "manufacturerInfo.origin" : "Germany" ])