Bazy dokumentów. MongoDB - Instytut Informatyki Teoretycznej i
Transkrypt
Bazy dokumentów. MongoDB - Instytut Informatyki Teoretycznej i
Bazy dokumentów. MongoDB Bazy dokumentów. MongoDB Technologie Zarządzania Treścią dr inż. Robert Perliński [email protected] Politechnika Częstochowska Instytut Informatyki Teoretycznej i Stosowanej 25 października 2016 1/67 Plan prezentacji 1 JSON 2 Bazy dokumentów 3 MongoDB Format BSON, typy danych MongoDB shell Dodawanie danych Pobieranie danych Aktualizacja danych Usuwanie danych 4 Źródła Bazy dokumentów. MongoDB 2/67 JSON JSON - JavaScript Object Notation. „Lekki”, tekstowy format wymiany danych. Niezależny od języka programowania i systemu operacyjnego. JSON wykorzystuje składnię JavaScript do opisu obiektów, ale mimo to nadal zachowuje niezależność od języka i platformy. Biblioteki parsujące format JSON są dostępne dla większości języków programowania. JSON to format samoopisujący się i łatwy do zrozumienia. Zbudowany na bazie dwóch struktur: kolekcji par klucz-wartość, uporządkowanej listy wartości. Bazy dokumentów. MongoDB 3/67 JSON - przykład JSON { "dane" : { "user" : [ { "imie" : "Jan", "nazwisko" : "Kowalski" }, { "imie" : "Piotr", "nazwisko" : "Nowak" } ] } } XML <?xml version="1.0" encoding="utf-8"?> <dane> <user> <imie>jan</imie> <nazwisko>Kowalski</nazwisko> </user> <user> <imie>Piotr</imie> <nazwisko>Nowak</nazwisko> </user> </dane> Bazy dokumentów. MongoDB 4/67 JSON vs. XML Podobieństwa: format tekstowy (plain text) samoopisujący się i czytelny dla użytkownika hierarchiczny (obiekty wewnątrz innych obiektów) Różnice: brak znaczników zamykających krótszy szybszy zapis i odczyt wykorzystuje tablice brak zastrzeżonych słów kluczowych Bazy dokumentów. MongoDB 5/67 Kolekcja par nazwa-wartość Kolekcja par klucz-wartość jest umieszczana w nawiasach klamrowych i może zawierać wiele par nazwa/wartość. Nie jest uporządkowana. Można ją nazywać obiektem, strukturą, tablicą hashowaną czy asocjacyjną, słownikem. { "imie" : "Piotr", "nazwisko" : "Nowak" } Bazy dokumentów. MongoDB 6/67 Uporządkowana lista wartości Uporządkowana lista wartości jest umieszczana w nawiasach kwadratowych. Może zawierać wiele wartości. Można ją nazywać tablicą, wektorem, listą czy sekwencją. "studenci":[ {"imie":"James", "nazwisko":"Bond"}, {"imie":"Jaś", "nazwisko":"Fasola"}, {"imie":"Angus", "nazwisko":"McGyver"} ] Bazy dokumentów. MongoDB 7/67 Wartości w JSONie Wartości JSON to: liczby (integer lub float) ciągi znakowe (string w podwójnych cudzysłowach) wartości logiczne (true lub false) tablice (w nawiasach kwadratowych) obiekt (w nawiasach klamrowych) wartość null Bazy dokumentów. MongoDB 8/67 Ciąg znaków String jest sekwencją zero lub więcej znaków Unicode zamkniętych w podwójne cudzysłowy. Możliwe jest wykorzystanie sekwencji unikowych zaczynających się od „\” (ang. backslash escapes). Pojedynczy znak jest traktowany jako ciąg znaków składających się z jednego znaku. Bazy dokumentów. MongoDB 9/67 Liczby w JSON Bardzo podobne do liczb w języku C lub Java, poza tym wyjątkiem, że ... nie używa się formatów ósemkowych i szesnastkowych. Bazy dokumentów. MongoDB 10/67 JSON - proste przykłady prawidłowe błędne 0 12 true null 123.4 -0 234E+3 -2e-23 "" "’" "\n\t\\" falsee {} {”a” : 12} { "asdf": []} {"name", "surname"} 1234E + 3 """ ’nulla’ nulla 12, 23 [1, "asdf": 12] [] [1, 2, 3] [{}, {}] [1, {"asdf": 12}] Bazy dokumentów. MongoDB 11/67 JSON - ciekawszy przykład { "data": [{ "id": "X999_Y999", "from": { "name": "Tom Brady", "id": "X12" }, "message": "Looking forward to 2010!", "actions": [{ "name": "Comment", "link": "http://www.facebook.com/X999/posts/Y999" }, { "name": "Like", "link": "http://www.facebook.com/X999/posts/Y999" }], "type": "status", "created_time": "2010-08-02T21:27:44+0000" }, { "id": "X998_Y998", "from": { "name": "Peyton Manning", "id": "X18" }, "message": "Where’s my contract?", "type": "status", "created_time": "2010-08-02T21:27:44+0000", "updated_time": "2010-08-02T21:27:44+0000" }] } Bazy dokumentów. MongoDB 12/67 JSON i obiekty JavaScript Obiekty JavaScript i JSON - ta sama składnia, taki sam dostęp: <html> <body> <p> Name: <span id="jname"></span><br /> Age: <span id="jage"></span><br /> Address: <span id="jstreet"></span><br /> Phone: <span id="jphone"></span><br /> </p> <script type="text/javascript"> var JSONObject= { "name":"John Johnson", "street":"Oslo West 555", "age":33, "phone":"555 1234567" }; document.getElementById("jname").innerHTML=JSONObject.name document.getElementById("jage").innerHTML=JSONObject.age document.getElementById("jstreet").innerHTML=JSONObject.street document.getElementById("jphone").innerHTML=JSONObject.phone </script> </body></html> Bazy dokumentów. MongoDB 13/67 JSON, JavaScript i funkcja eval W języku JavaScript nie ma potrzeby używania parserów. Funkcja eval() przekształca tekst w formacie JSON na obiekt. Dane tekstowe w formacie JSON przekazane do funkcji eval powinny zostać zamknięte w nawiasy okrągłe. Np JSON: {"imie": "Ala"} var JSONobject = eval("({\"imie\":\"Ala\"})"); Bazy dokumentów. MongoDB 14/67 JSON, JavaScript i funkcja eval <html> <body> Imie: <span id="imie_label"></span><br /> Wiek: <span id="wiek_label"></span> <script type="text/javascript"> var jsonO = eval(" ( { \"osoby\": [ {\"imie\": \"Jan\",\"wiek\":23}, {\"imie\": \"Ala\",\"wiek\":25} ] } ) "); document.getElementById("imie_label").innerHTML= jsonO.osoby[1].imie document.getElementById("wiek_label").innerHTML= jsonO.osoby[1].wiek </script> </body> </html> ( {"osoby": [ {"imie": "Jan", "wiek":23}, {"imie": "Ala", "wiek":25} ] } ) Bazy dokumentów. MongoDB 15/67 Bazy danych dokumentów Popularne bazy danych dokumentów (klasyfikacja według serwisu db-engines.com): MongoDB (4 ↑ ) Couchbase (22 ↑) Amazon DynamoDB (24 ↑) CouchDB (27 ↓) MarcLogic (multimodel, 33 ↓) OrientDB (multimodel, 42 ↑) RethinkDB (46 ↑) Cloudant (50 ↑) RavenDB (53 ↓) GemFire (59 ↓) Microsoft Azure DocumentDB (62 ↑) Virtuoso (multimodel, 68 ↑) Apache Drill (multimodel, 72 ↑) ... 44 bazy danych dokumentów na 316 wszystkich (to jest prawie 14%) Bazy dokumentów. MongoDB 16/67 Statystyki dla modeli danych - liczba DBMS Bazy dokumentów. MongoDB 17/67 Statystyki dla modeli danych - udział w rynku Bazy dokumentów. MongoDB 18/67 Instancja bazy danych dokumentów Każda instancja bazy dokumentów może posiadać wiele baz. Każda baza składa się z wielu kolekcji. Kolekcje zawierają zbiór dokumentów. Bazy dokumentów. MongoDB 19/67 Bazy danych dokumentów Bazy danych dokumentów: dokumenty są głównym składnikiem, format dokumentów: XML, JSON, BSON i inne, są do siebie podobne ale mogą się różnić - nie ma schematu. Dokumenty: samoopisujące się, hierarchiczne struktury drzewiaste, mogą składać się z map, kolekcji, wartości skalarnych. Bazy dokumentów. MongoDB 20/67 Bazy danych dokumentów Bazy danych dokumentów: zapewniają elastyczność baz NoSQL, pozwalają na zarządzanie bardziej złożonlymi strukturami niż te w bazach klucz-wartość, nie wymagają definiowania wspólnej struktury, jest możliwe filtrowanie czy odpytywanie kolekcji dokumentów (podobnie do bazy relacyjnej), inna składnia zapytań niż w bazach relacyjnych ale podobna funkcjonalność. Bazy dokumentów. MongoDB 21/67 Więcej o dokumentach Dokumenty: różne dokumenty mogą znajdować się w jednej kolekcji, dokumenty mogą mieć różne nazwy atrybutów, brak pustych atrybutów - jak nie ma wartośći to po prostu nie ma atrybutu, możliwość dodawania nowych atrybutów w każdej chwili. Bazy dokumentów. MongoDB 22/67 Baza danych MongoDB https://www.mongodb.org/ MongoDB: open-source, baza danych dokumentów, nie potrzeba mapowania obiektowo-relacyjnego (ORM), łatwa w wykorzystaniu i skalowaniu, zawiera swój własny język zapytań, obecnia wersja to 3.2. Bazy dokumentów. MongoDB 23/67 Terminologia w Oracle i w MongoDB Oracle instancja bazy danych schemat tabela wiersz rowid złączenie MongoDB instancja MongoDB baza danych kolekcja dokument id DBRef W Mongo pole id występuje we wszystkich dokumentach, może być ustawiane przez użytkownika. DBRef - referencja wskazująca na dokument w bazie MongoDB. Składa się z pól: $ref (kolekcja), $id oraz opcjonalnie $db (baza danych). Bazy dokumentów. MongoDB 24/67 Dokument w MongoDB Dokument w MongoDB: odpowiednik rekordu w bazach relacyjnych, przechowuje dane w formacie BSON, jest bardzo podobny do obiektów JSON, składa się par nazwa:wartość, wartości mogą zawierać inne dokumenty, tablice i tablice dokumentów, np.: db.osoby.insert({"name":[1, 2, "Jan Kowalski"]}) sam dokument nie może być tablicą, zawiera pole id o unikalnej wartości, trochę jak primary key. Bazy dokumentów. MongoDB 25/67 Importowanie danych do MongoDB Importowanie danych zawartych w plikach JSON poleceniem mongoimport Przykład: mongoimport --db test --collection restaurants --drop --file restaurants-dataset.json Polecenie mongoimport: wstawia dokumenty do bazy test, do kolekcji restaurants, jeśli kolekcja restauracje już istaniała to zostanie usunięta: --drop, dane zawarte w pliku restaurants-dataset.json, parametr --file, dane w pliku to lista dokumentów nie oddzielonych przecinkiem, łączy się z mongod uruchomionym na localhost, port 27017, parametry --host i --port w razie potrzeby. Bazy dokumentów. MongoDB 26/67 MongoDB shell (mongo) MongoDB shell: interakcyjne narzędzie dla MongoDB, interfejs w JavaScript, składowy komponent pakietu MongoDB, pozwala na pobieranie, aktualizację danych, operacje administracyjne, uruchamiane poleceniem mongo, domyślnie łączy się z localhost na porcie 27017, instancja MongoDB musi być uruchomiona, zawiera polecenie help, klawisz <tab> dopełnia polecenia. Bazy dokumentów. MongoDB 27/67 MongoDB shell, polecenia systemowe Polecenia systemowe w MongoDB shell: ls() - lista zawartości bieżącego katalogu jako tablica JSON, listFiles() - lista zawartości bieżącego katalogu, jako tablia JSON, każde pole to obiekt (nazwa, wielkość, czy jest katalogiem), pwd() - pokazje bieżący katalog, cd() - zmiana katalogu, np. cd("Pulpit"), cd(".."), cat() - wyświetla zawartość pliku, np. cat("plik.json"), mkdir() - tworzy katalog, np. mkdir("templates"), removeFile() - usuwa plik, katalog, np. removeFile("abc.json"), exit, quit() - wyłącza mongo shell. Bazy dokumentów. MongoDB 28/67 Format BSON Binary JSON - http://bsonspec.org/ binarna serializacja dokumentów w formacie JSON tak samo jak JSON, wspiera zagnieżdżanie dokumentów i tablic wewnątrz innych dokumentów czy tablic zawiera również rozszerzenie pozwalające na reprezentację danych nie będących formatem JSON, np. posiada typy Date czy BinData jest binarnym formatem wymiany danych biblioteki dla BSON istnieją dla większości współczesnych języków programowania; część implementacji obsługi BSON jest częścią sterownika do bazy MongoDB Bazy dokumentów. MongoDB 29/67 BSON - charakterystyka Lekkość - minimalny narzut na zajmowaną przestrzeń; bardzo ważne dla każdego formatu reprezentacji danych, szczególnie w zastosowaniach internetowych. Łatwość przeszukiwania/przeglądania - BSON został zaprojektowany aby dało się go łatwo przeszukiwać; cecha konieczna dla głównego formatu przechowywania danych w MongoDB. Efektywność - kodowanie/dekodowanie danych do/z formatu BSON jest bardzo szybkie w większości języków programowania. Bazy dokumentów. MongoDB 30/67 BSON - przykład Dokumentem w formacie BSON nazywamy zero lub więcej par klucz/wartość przechowywanych jako jedna jednostka (obiekt). Fragment specyfikacji: document ::= int32 e_list "\x00" e_list ::= element e_list | "" element ::= "\x01" e_name double | "\x02" e_name string | ... e_name ::= cstring string ::= int32 (byte*) "\x00" cstring ::= (byte*) "\x00" BSON Document 64-bit binary floating point UTF-8 string wartość klucza Przykład {"hello": "world"} \x16\x00\x00\x00 \x02 hello\x00 \x06\x00\x00\x00world\x00 \x00 Bazy dokumentów. MongoDB // // // // // całkowity rozmiar dokumentu, 22b 0x02 = typ String nazwa pola wartość pola 0x00 = typ EOO (’end of object’) 31/67 Typy danych BSON BSON pozwala na przechowywanie danych następujących typów: Typ Double String Object Array Binary data Undefined Object id Boolean Date Numer 1 2 3 4 5 6 7 8 9 Alias ”double” ”string” ”object” ”array” ”binData” ”undefined” ”objectid” ”bool” ”date” Notatki przestarzały Typy mają przypisany numer i alias do wykorzystania z operatorem $type. Istnieje alias ”number” odnoszący się do typów: double, int oraz long. Aliasy działają od wersji 3.2 (najnowszej). Bazy dokumentów. MongoDB 32/67 Typy danych BSON II BSON pozwala na przechowywanie danych następujących typów (cd.): Typ Null Regular Expression DBPointer JavaScript Symbol JavaScript (with scope) 32-bit integer Timestamp 64-bit integer Min key Max key Bazy dokumentów. MongoDB Numer 10 11 12 13 14 15 16 17 18 -1 127 Alias ”null” ”regex” ”dbPointer” ”javascript” ”symbol” ”javascriptWithScope” ”int” ”timestamp” ”long” ”minKey” ”maxKey” Notatki przestarzały 33/67 Rozszerzenia formatu JSON I JSON uwzględnia tylko część danych z formatu BSON. Zachowanie informacji o typie wymaga od MongoDB dodania pewnych rozrzeszeń do formatu JSON: tryb rygorystyczny (ang. strict mode) reprezentacja formatu BSON zawsze zgodna z JSON, każdy parser JSON sobie poradzi z zawartością (pary klucz:wartość), tylko parser MongoDB rozpozna informacje o typie danych, tryb mongo Shell (ang. mongo Shell mode) parsowany przez wewnętrzny parser MongoDB, parsowany przez mongo shell. Bazy dokumentów. MongoDB 34/67 Rozszerzenia formatu JSON II Tryb rygorystyczny może być parsowany z rozpoznaniem informacji o typie: przez interfejsy REST (różne języki programowania), mongoimport, różne narządzia MongoDB przy opcji --query Inne parsery JSONa (włącznie z mongo shell i db.eval() dokonają parsowania ale nie rozpoznają typów danych w trybie rygorystycznym. Tryb mongo Shell może być parsowany z rozpoznaniem informacji o typie: przez interfejsy REST (różne języki programowania), mongoimport, różne narządzia MongoDB przy opcji --query, mongo shell. Bazy dokumentów. MongoDB 35/67 Rozszerzenia formatu - dane wyjściowe, reprezentacje Dane wyjściowe w trybie rygorystycznym: mongoexport, interfejsy REST i HTTP Dane wyjściowe w trybie mongo Shell: bsondump Niektóre typy danych BSON i ich reprezentacje: tryb rygorystyczny { ”$date”: ”<date>”} tryb mongo shell new Date ( <date> ) { ”$binary”: ”<bindata>”, ”$type”: ”<t>”} BinData ( <t>, <bindata> ) { ”$oid”: ”<id>”} ObjectId( ”<id>”) { ”$numberLong”: ”<number>”} NumberLong( ”<number>”) Bazy dokumentów. MongoDB 36/67 Typy danych BSON - MinKey, MaxKey MinKey, MaxKey Używane przy porównywaniu, najczęściej do wewnętrznego użycia. Ze wszystkich możliwych wartości jakie mogą przyjąć dane w BSON: MinKey zawsze będzie miało najmniejszą wartość, MaxKey zawsze będzie miało największą wartość, dodawanie danych do kolekcji: db.dane.insert({numer: MinKey(12345)}) db.dane.insert({numer: MaxKey(12345)}) Bazy dokumentów. MongoDB 37/67 Typy danych BSON - Date Data - 64-bitowa liczba całkowita, liczba milisekund od epoki Unixa (1.I.1970). Wartośći ujemne reprezentuja czas przed 1970. Utworznie daty: Date() - konstruktor zwraca datę jako String new Date() - konstruktor zwraca datę ISODate ISODate() - j.w. Na obiekcie daty można wywoływać wiele funkcji (JavaScript), m.in.: getDate(), getUTCDate(), getYear(), getUTCFullYear(), getMonth(), ... setDate(), setYear(), setFullYear(), setMonth(), ... toDateString(), toTimeString(), tojson(), toString(), ... Działanie na datach: var d = ISODate() (ISODate()-d)/1000 // liczba sekund od zapamiętanej wartości do wywołania d instanceof Data // true typeof "jakiś napis ..." // string typeof (ISODate()-d) // number Bazy dokumentów. MongoDB 38/67 Operator $type $type - operator pozwala wybrać dokumenty, w których wartość wybranego pola jest konkretnego typu BSON. Przydaje się dla dokumentów o nieznanej, bardzo zmiennej strukturze. Składnia wyrażenia z operatorem $type: { pole: { $type: <numer typu danych BSON> | <String alias> } } Operator dopasowuje dokumenty, w których typ pola jest zgodny z podanym. Tablice Dla typu ”array” operator dopasowue wewnętrzną zawartość podanego pola. Przykładowo: { dane: { $type: 4 } } wybierze dokumenty, w których pole dane ma wewnątrz tablicę. Samo pole dane może być tablicą, nie musi, typ pola dane nie ma znaczenia, ważne czy ma zagnieżdżoną tablicę. Bazy dokumentów. MongoDB 39/67 Operator $type - przykłady Dane typu: string, double (domyślny typ numeryczny), int, long. Dodawanie danych różnych typów (pole kod): db.rozne.insert({"_id":1,adres:"Długa 123", kod: "42200"}) db.rozne.insert({"_id":2,adres:"Okólna 23", kod: 42262}) db.rozne.insert({"_id":3,adres:"Korczaka 12 m 8", kod: NumberLong(42217)}) db.rozne.insert({"_id":4,adres:"Nowotarska 45", kod: NumberInt(34312)}) Dane w kolekcji rozne, db.rozne.find(): { { { { "_id" "_id" "_id" "_id" : : : : 1, 2, 3, 4, "adres" "adres" "adres" "adres" : : : : "Długa 123", "kod" : "42200" } "Okólna 23", "kod" : 42262 } "Korczaka 12 m 8", "kod" : NumberLong(42217) } "Nowotarska 45", "kod" : 34312 } Przykładowe zapytania i wyniki: db.rozne.find({kod: db.rozne.find({kod: db.rozne.find({kod: db.rozne.find({kod: Bazy dokumentów. MongoDB {$type:1}}) {$type:2}}) {$type:16}}) {$type:18}}) ----- double: Okólna 23 string: Długa 123 int: Nowotarska 123 long: Korczaka 12 m 8 40/67 Porządek porównywania/sortowania Porównywanie różnych typów danych BSON w MongoDB uzwględniana jest określona kolejność, od najmniejszego do największego priorytetu: 1 2 3 4 5 6 7 8 9 10 11 12 13 MinKey (typ wewnętrzny) Null Numbers (ints, longs, doubles) Symbol, String Object Array BinData ObjectId Boolean Date Timestamp Regular Expression MaxKey (typ wewnętrzny) Bazy dokumentów. MongoDB 41/67 Porządek porównywania/sortowania - przykład Dodajemy różne dane do kolekcji: db.dane.insert({"_id": 1,numer: db.dane.insert({"_id": 2,numer: db.dane.insert({"_id": 3,numer: db.dane.insert({"_id": 4,numer: db.dane.insert({"_id": 5,numer: db.dane.insert({"_id": 6,numer: db.dane.insert({"_id": 7,numer: db.dane.insert({"_id": 8,numer: db.dane.insert({"_id": 9,numer: db.dane.insert({"_id":10,numer: db.dane.insert({"_id":11,numer: db.dane.insert({"_id":12,numer: db.dane.insert({"_id":13,numer: db.dane.insert({"_id":14,numer: "12345"}) // string 12345}) // double NumberLong(12345)}) NumberInt(12345)}) true}) null}) new Date()}) // data jako ISODate Timestamp()}) [1,2,3]}) // tablica [1,2,["a","b","c"]]}) // tablica z tablicą ale... new BinData(2,"1234")}) MinKey(12345)}) MaxKey(12345)}) Date()}) // data jako string Wyniki przy sortowaniu, db.dane.find().sort({numer:1}): { { { { { { { { { { { { { { "_id" "_id" "_id" "_id" "_id" "_id" "_id" "_id" "_id" "_id" "_id" "_id" "_id" "_id" : : : : : : : : : : : : : : 12, 6, 10, 9, 2, 3, 4, 1, 14, 11, 5, 7, 8, 13, "numer" "numer" "numer" "numer" "numer" "numer" "numer" "numer" "numer" "numer" "numer" "numer" "numer" "numer" Bazy dokumentów. MongoDB : : : : : : : : : : : : : : { "$minKey" : 1 } } null } [ 1, 2, [ "a", "b", "c" ] ] } [ 1, 2, 3 ] } 12345 } NumberLong(12345) } 12345 } "12345" } "Wed Jan 13 2016 00:06:39 GMT+0100 (CET)" } BinData(2,"1234") } true } ISODate("2016-01-12T22:45:10.584Z") } Timestamp(1452638761, 1) } { "$maxKey" : 1 } } 42/67 Porządek porównywania/sortowania - przykład Dodajemy różne dane do kolekcji: db.dane.insert({"_id": 1,numer: db.dane.insert({"_id": 2,numer: db.dane.insert({"_id": 3,numer: db.dane.insert({"_id": 4,numer: db.dane.insert({"_id": 5,numer: db.dane.insert({"_id": 6,numer: db.dane.insert({"_id": 7,numer: db.dane.insert({"_id": 8,numer: db.dane.insert({"_id": 9,numer: db.dane.insert({"_id":10,numer: db.dane.insert({"_id":11,numer: db.dane.insert({"_id":12,numer: db.dane.insert({"_id":13,numer: db.dane.insert({"_id":14,numer: "12345"}) // string 12345}) // double NumberLong(12345)}) NumberInt(12345)}) true}) null}) new Date()}) // data jako ISODate, dzięki new! Timestamp()}) [1,2,3]}) // tablica [1,2,["a","b","c"]]}) // tablica z tablicą ale... new BinData(2,"1234")}) MinKey(12345)}) MaxKey(12345)}) Date()}) // data jako string Wyniki przy sortowaniu, db.dane.find().sort({numer:-1}): { { { { { { { { { { { { { { "_id" "_id" "_id" "_id" "_id" "_id" "_id" "_id" "_id" "_id" "_id" "_id" "_id" "_id" : : : : : : : : : : : : : : 13, 8, 7, 5, 11, 10, 14, 1, 2, 3, 4, 9, 6, 12, "numer" "numer" "numer" "numer" "numer" "numer" "numer" "numer" "numer" "numer" "numer" "numer" "numer" "numer" Bazy dokumentów. MongoDB : : : : : : : : : : : : : : { "$maxKey" : 1 } } Timestamp(1452638761, 1) } ISODate("2016-01-12T22:45:10.584Z") } true } BinData(2,"1234") } [ 1, 2, [ "a", "b", "c" ] ] } "Wed Jan 13 2016 00:06:39 GMT+0100 (CET)" } "12345" } 12345 } NumberLong(12345) } 12345 } [ 1, 2, 3 ] } null } { "$minKey" : 1 } } 43/67 Dodawanie danych do MongoDB Dodawanie danych w MongoDB shell: db.studenci.insert({...}) - dodaje dokument do kolekcji studenci, tworzy kolekcję studenci jeśli nie istniała, zwraca obiekt WriteResult zawierający status operacji, np.: WriteResult({ "{}nInserted" : 1 }), dodaje automatycznie pole id, chyba, że podano jawnie. Bazy dokumentów. MongoDB 44/67 Dodawanie danych do MongoDB Polecenie db.kolekcja.insert() - dodawanie dokumentów: kolekcja par klucz wartość czyli obiekt, przykłady: pusty obiekt: db.osoby.insert( {} ) jeden atrybut: db.osoby.insert( {"name":"Jan Kowalski"} ) dwa atrybuty: db.osoby.insert( {"name1":"Jan Nowak","name2":"Patryk Wilk"} ) tablica jako składowa obiektu: db.osoby.insert( {"names":["Jan Kowalski","Wojtek Nowak"]} ) uporządkowaną listę wartości czyli tablicę, każdy element tablicy musi być poprawnym obiektem, każdy element tablicy dodaje osobny dokument, przykład: db.osoby.insert( [ {"name":"James Bond"}, {"name":"Tomasz Kalosz"}, {"name":"Roman Witek"} ] ) Bazy dokumentów. MongoDB 45/67 Restauracje - przykładowy dokument { "_id" : ObjectId("5667127503cc04bb98aabd9b"), "adres" : { "numer" : "1007", "wspolrzedne" : [ -73.856077, 40.848447 ], "ulica" : "Morris Park Ave", "kod" : "10462" }, "dzielnica" : "Bronx", "jedzenie" : "Bakery", "oceny" : [ { "data" : ISODate("2014-03-03T00:00:00Z"), "ocena" : "A", "punkty" : 2 }, { "data" : ISODate("2013-09-11T00:00:00Z"), "ocena" : "A", "punkty" : 6 }, { "data" : ISODate("2013-01-24T00:00:00Z"), "ocena" : "A", "punkty" : 10 } ], "nazwa" : "Morris Park Bake Shop", "rest_id" : "30075445" } Bazy dokumentów. MongoDB 46/67 Pobieranie danych Wyszukiwanie danych - metoda find(): db.kolekcja.find(<zapytanie>, <projekcja>) oba parametry są opcjonalne, <zapytanie> określa kryteria wyboru dokumentów z kolekcji brak parametru <zapytanie> albo pusty dokument ({}) zwraca całą kolekcję, <projekcja> określa, które pola dokumentu mają być zwrócone, zwrócenie całej zawartości dokumentu poprzez opuszczenie parametru <projekcja>. Bazy dokumentów. MongoDB 47/67 Pobieranie danych Pobieranie danych: wszystkie zapytania mają zasięg pojedynczej kolekcji, find() zwraca wyniki w postaci kursora - obiekt, po którym iterujemy zawierający dokumenty, find() w mongo shell automatycznie iteruje wyniki kursora wyświetlając po 20, polecenie it wyświetla kolejne 20 wyników. Pobieranie wszystkich dokumentów: db.restaurants.find() - pobiera listę wszystkich restauracji, db.restaurants.count() - zwraca liczbę dokumentów w kolekcji, db.restaurants.find().pretty() - lista restauracji, ładne formatowanie JSONa. Bazy dokumentów. MongoDB 48/67 Parametr <projekcja> <projekcja> to dokument w postaci: { pole1: <boolean>, pole2: <boolean> ... } Z parametrem <projekcja> dokument zwracany przez find() zawiera: pola wyróżnione w projekcji oraz pole id, pole id można wykluczyć, domyślnie jest uwzględniane, wartość logiczna <boolean> może mieć wartość: 1 albo true dla uwzględnienia pola w metodzie find(), 0 albo false dla wykluczenia pola. projekcja zawiera albo tylko wykluczenia albo tylko uwzględnienia parametrów, jedynym wyjątkiem jest parametr id, przykłady dla kolekcji restaruracji: db.restaurants.find({},{nazwa:1}) - dokumenty z id i nazwą, db.restaurants.find({},{adres:0,oceny:0}) - wszystko poza adresem i ocenami db.restaurants.find({},{ id:0,adres:1}) - sam adres, bez pola id Bazy dokumentów. MongoDB 49/67 Zapytania, warunki równościowe Dokumenty będące zapytaniem z warunkiem równościowym mają formę: { <pole1>: <wartosc1>, <pole2>: <wartosc2>, ... } dla pól najwyższego poziomu (bezpośrednio w dokumencie) nazwę pola można wziąść w cudzysłów albo go pominąć: db.restaurants.find( { dzielnica: "Manhattan"} ) db.restaurants.find( { "dzielnica": "Manhattan"} ) dla pól niższego poziomu (zagnieżdżonych w dokumencie) używamy notacji kropkowej, trzeba użyć cydzysłowu: db.restaurants.find( { "adres.kod": "10075"} ) analogicznie odwołujemy się do zagnieżdżonych tablic: db.restaurants.find( { "oceny.ocena": "B"} ) Bazy dokumentów. MongoDB 50/67 Zapytania, określanie warunków z operatorami Zapytania z określeniem warunku generalnie mają formę: { <pole1>: { <operator1>: <wartosc1> } } Przykłady: restauracje - przynajmniej jedna z ocen większa niż 30: db.restaurants.find( { "oceny.punkty": { $gt: 30 } } ) restauracje - oceny nie zwierają kategorii ”B”: db.restaurants.find( { "oceny.ocena": { $ne: "B"} } ) Bazy dokumentów. MongoDB 51/67 Zapytania, operatory porównania Operatory porównania: $eq - wartości równe podanej wartości, $gt - wartości większe niż podana wartość, $gte - wartości większe lub równe podanej wartości, $lt - wartości mniejsze niż podana wartość, $lte - wartości mniejsze lub równe podanej wartości, $ne - wartości różne od podanej, $in - dopasowuje dane zawierające którąkolwiek z wartości podanych w tablicy, np.: db.testowa.find( { tab:{ $in:[1,3] } } ) $nin - dopasowuje wszystkie dane nie zawierające wartości podanych w tablicy. Bazy dokumentów. MongoDB 52/67 Zapytania, operatory logiczne Operatory logiczne: $or - łączy klauzule zapytania logicznym OR, zwraca dokumenty spełniające którąkolwiek z klauzul, $and - łączy klauzule zapytania logicznym AND, zwraca dokumenty, które spełniają wszystkie klauzule, $not - negacja logiczna, zwraca dokumenty, które nie spełniły warunków utworzonego zapytania, $nor - łączy klauzule zapytania logicznym NOR, zwraca dokumenty, które nie spełniły obu klauzul zapytania. Bazy dokumentów. MongoDB 53/67 Zapytania, łączenie warunków, operator AND Zapytania z warunkiem łączonym AND, oddzielone przecinkiem: { <pole1>: <wartosc1>, <pole2>: <wartosc2>, ... } restauracje - ocena mniejsza niż 10 AND kod pocztowy równy 10462: db.restaurants.find({ "oceny.punkty":{ $lt:10 }, "adres.kod":"10462" }) Zapytania z warunkiem łączonym AND, operator $and, warunki w tablicy: { $and: [ {<pole1>: <wartosc1>}, {<pole2>: <wartosc2>}, ... ] } restauracje - ocena mniejsza niż 10 AND kod pocztowy równy 10462: db.restaurants.find({ $and:[ {"oceny.punkty":{$lt:10} }, {"adres.kod":"10462"} ] }) Bazy dokumentów. MongoDB 54/67 Zapytania, łączenie warunków, operator OR Zapytania z warunkiem łączonym OR, operator $or, warunki w tablicy: { $or: [ {<pole1>: <wartosc1>}, {<pole2>: <wartosc2>}, ... ] } restauracje - ocena mniejsza niż 10 OR kod pocztowy równy 10462: db.restaurants.find( { $or:[ {"oceny.punkty": {$lt:10} }, {"adres.kod": "10462"} ] } ) Bazy dokumentów. MongoDB 55/67 Zapytania, operator NOT { <pole>: { $not: { <wyrażenie-operatorowe> } } } Logiczna operacja NIE dla podanego <wyrażenia-operatorowego>, wybiera dokumenty nie spełniające <wyrażenia-operatorowego>, czyli wybiera też elementy nie posiadające pola <pole> Przykład restauracje (5756 wyników): ocena mniejsza lub równa 10 albo w ogóle brak pola oceny.punkty: db.restaurants.find({ "oceny.punkty": {$not: {$gt: 10} } }) Przykład restauracje (21055 wyników): ocena mniejsza lub równa 10 db.restaurants.find({ "oceny.punkty": {$lte: 10} }) Bazy dokumentów. MongoDB 56/67 Zapytania, operatory dotyczące elementów i tablicowe Operatory dotyczące elementów: $exists - dopasowuje dokumenty zawierające podane pole, $type - dopasowuje dokumenty, w których podane pole jest określonego typu. Operatory tablicowe: $all - dopasowuje tablice, które zawierają wszystkie elementy określone w zapytaniu, $elemMatch - dopasowuje dokumenty, w których jest tablica z przynajmniej jednym elementem spełniającym wszystkie kryteria podane w $elemMatch, $size - dopasowuje dokumenty, w których podana tablica ma określoną wielkość. Bazy dokumentów. MongoDB 57/67 Zapytania, metody limit() i skip() cursor.limit() określa liczbę dokumentów zwracaną przez kursor, nie pobieramy więcej niż jesteśmy w stanie przetworzyć. Przykład - pobranie pierwszych 7 restauracji: db.restaurants.find().limit(7) cursor.skip() określa liczbę początkowych pominiętych dokumentów, można wykorzystać do tworzenia przeglądania danch stronami. Przykład - lista restauracji bez pierwszych 5: db.restaurants.find().skip(5) Bazy dokumentów. MongoDB 58/67 Zapytania, sortowanie wyników Określenie kolejności danych wyjściowych - metoda sort(): db.kolekcja.find().sort( { kryterium1, kryterium2, ... } ) Do metody sort() przekazujemy dokument zawierający: pola, po których sortujemy, typ sortowania: 1 - porządek rosnący, -1 - porządek malejący. Przykład: restaruracje uporządkowane najpierw malejąco po nazwach dzielnic i następnie rosnąco po kodzie pocztowym: db.restaurants.find().sort( { "dzielnica": -1, "adres.kod": 1 } ) Bazy dokumentów. MongoDB 59/67 Aktualizacja danych Aktualizacja danych - metoda upadate(): db.kolekcja.update( <zapytanie>, <update>, { upsert: <boolean>, multi: <boolean>, writeConcern: <document> } ) modyfikuje dokument(y) w kolekcji, które odpowiadają zapytaniu, modyfikuje wybrane pola albo całe dokumenty - parametr <update>, domyślnie aktualizuje jeden dokument, parametry upsert, multi i writeConcern są opcjonalne. Bazy dokumentów. MongoDB 60/67 Aktualizowane dane db.kolekcja.update( <zapytanie>, <update>, { upsert: <boolean>, multi: <boolean>, writeConcern: <document> } ) <update> - dokument aktualizacyjny, np. { $inc: { wydajnosc: -2, "zamówienia.liczba": 1 } } Polecenie update() - aktualizacja konkretnych pól: dokument aktualizacyjny zawiera operatory aktualizacji, update() aktualizuje tylko pola określone w operatorach aktualizacji. Polecenie update() - aktualizacja całego dokumentu: dokument aktualizacyjny zawiera tylko wyrażenia pole:wartość, bez operatorów, dokumenty dopasowane przez <zapytanie> są zastępowane przez dokument aktualizacyjny, pole id nie jest zmieniane, update() nie aktualizuje wielu dokumentów na raz. Bazy dokumentów. MongoDB 61/67 Operatory aktualizacji pól Najważniejsze operatory wykorzystywanie przy aktualizacji danych: https://docs.mongodb.org/v3.0/reference/operator/update/ $inc - zwiększa wartość pola o podaną liczbę, $mul - mnoży wartość pola podaną liczbę razy, $rename - zmienia nazwę (klucz) pola, $set - zmienia/ustawia wartość pola, $unset - usuwa podane pole z dokumentu, $min, $max - aktualizuje pole tylko, jeśli podana wartość jest mniejsza, większa niż bieżąca wartość pola, $currentDate - ustawia wartość pola na bieżącą datę jako typ Date albo Timestamp, $setOnInsert - ustawia wartość pola jeśli update() skończyło się dodaniem nowego dokumentu, w przypadku aktualizacji nie wpływa na dane. Bazy dokumentów. MongoDB 62/67 Aktualizacja tablic - operatory Operatory wykorzystywanie przy aktualizacji tablic: $ - działa jako symbol zastępczy do aktualizacji pierwszego z elementów tablicy spełniającego warunki zapytania, $addToSet - dodaje element do tablicy pod warunkiem, że nie ma go obecnie w tablicy, $pop - usuwa pierwszy albo ostani element z tablicy, $pullAll - usuwa z podanych tablic wszystkie wymienione elementy, $pull - usuwa wszystkie elementy z tablic spełniające określone warunki, $push - dodaje pola do podanych tablic. Bazy dokumentów. MongoDB 63/67 Aktualizacja tablic - modyfikatory Modyfikatory dla operatora $push: $each - pozwala na dodanie listy elementów do tabeli, $slice - pozwala zachować określoną liczbę elementów w tablicy, pozostałe są usuwane, $sort - pozwala na porządkowanie elementów w tablicy po ich aktualizacji, $position - określa pozycję, w której dodajemy element do tablicy. Operacje bitowe na polach dokumentu: $bit - wykonuje bitowe operacje AND, OR, XOR na polach z wartością całkowitą. Bazy dokumentów. MongoDB 64/67 Aktualizacja danych Aktualizacja danych - metoda upadate(): db.kolekcja.update( <zapytanie>, <update>, { upsert: <boolean>, multi: <boolean>, writeConcern: <document> } ) upsert, opcjonalny, dla true tworzy nowy dokument jeśli zapytanie żadnego nie dopasowało, domyślnie false - przy braku dopasowania nic nie dodaje, multi, opcjonalny, dla true aktualizuje wszystkie dopasowane dokumenty, domyślnie false, writeConcern, opcjonalny, dokument określający writeConcern czyli troskę o zapis. Bazy dokumentów. MongoDB 65/67 Usuwanie danych Usuwanie danych: db.kolekcja.remove( <zapytanie>, <justOne> ) remove() usuwa dokumenty z kolekcji, które odpowiadają zapytaniu, parametr <justOne> jest opcjonalny - dla true, remove() usuwa tylko jeden dokument, usuwa te dokumenty, które metoda find() by pobrała, przykłady: db.restaurants.find({’adres.ulica’:"Corson Ave"}) db.restaurants.remove({’adres.ulica’:"Corson Ave"}) db.restaurants.remove() db.restaurants.remove({}) db.restaurants.remove({’adres.ulica’:"Grand Ave"}, true) db.restaurants.remove({’adres.ulica’:"Grand Ave"}, { justOne: 1}) Bazy dokumentów. MongoDB 66/67 Źródła https://www.g2crowd.com/press-release/ best-nosql-databases-fall-2015/ https://en.wikipedia.org/wiki/Redis https://github.com/sripathikrishnan/redis-rdb-tools/wiki/ Redis-RDB-Dump-File-Format http://redis.io/topics/cluster-spec Bazy dokumentów. MongoDB 67/67