ongodb. Narzędzia, transakcje, referencje 1/73 MongoDB. Narzędzia, transakcje, referencje Technologie Zarządzania Treścią dr inż. Robert Perliński rperlinski@icis.pcz.pl Politechnika Częstochowska Instytut Informatyki Teoretycznej i Stosowanej 2 grudnia 2017
MongoDB. Narzędzia, transakcje, referencje 2/73 Plan prezentacji 1 MongoDB 2 MongoDB shell 3 Narzędzia administracyjne od twórców MongoDB darmowe od innych dostawców komercyjne do przeglądania danych 4 Referencje w MongoDB 5 Zapytania z polami tablic 6 Transakcje 7 Źródła
MongoDB. Narzędzia, transakcje, referencje 3/73 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.
MongoDB. Narzędzia, transakcje, referencje 4/73 Exportowanie danych z MongoDB Exportowanie danych znajdujących się w bazie MongoDB mongoexport Przykład: mongoexport --db test --collection restaurants --query '{"dzielnica":"bronx"}' --fields dzielnica,adres --out bronxrestaurants.json Polecenie mongoexport: zapisuje kolekcję restaurants z bazy test w pliku tekstowym, dane zapisywane są w pliku bronxrestaurants.json, parametr --out, (domyślnym formatem jest JSON), parametr --query pozwala wprowadzić zapytanie w formacie JSON ograniczające liczbę dokumentów pobranych z kolekcji, parametr --fields pozwala określić, które pola dokumentu mają być eksportowane, łączy się z mongod uruchomionym na localhost, port 27017, parametry --host i --port w razie potrzeby.
MongoDB. Narzędzia, transakcje, referencje 5/73 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.
MongoDB. Narzędzia, transakcje, referencje 6/73 Wybrane polecenia w mongo shell I Polecenia w mongo: help - wyświetla pomoc, klawisz TAB dopełnia polecenia, show dbs - wyświetla listę baz, use test - przełącza na bazę test, show collections - wyświetla listę kolekcji, db.help() - wyświetla listę dostępnych metod dla bazy danych, db.dropdatabase() - uwuwa bieżącą bazę danych, db.getname() - wyświetla nazwę bieżącej bazy, db.stats() - wyświetla statystyki bieżącej bazy, db.hostinfo() - informacje o serwerze, db.version() - wyświetla wersję serwera.
MongoDB. Narzędzia, transakcje, referencje 7/73 Wybrane polecenia w mongo shell II Polecenia w mongo: db.osoby.help() - wyświetla listę dostępnych metod dla kolekcji osoby, db.osoby.count() - wyświetla liczbę dokumentów w kolekcji, db.osoby.find() - wyświetla zawartość kolekcji osoby, db.osoby.find({"imie":"wojciech"}) zwraca te dokumenty, które spełniają warunek, db.osoby.remove() - usuwa dokumenty z kolekcji, db.osoby.drop() - usuwa kolekcję osoby z bazy danych, db.osoby.insert({ "imie": "Wojciech", "nazwisko": "Paluch", "dataur": "1985/07/14", "kraj": "Polska" }) - wstawia dane do kolekcji, db.osoby.getindexes() - wyświetla informacje o indeksach kolekcji osoby.
MongoDB. Narzędzia, transakcje, referencje 8/73 Część listy poleceń dla kolekcji Polecenie db.osoby.help(): db.osoby.find().help() - show DBCursor help db.osoby.count() db.osoby.copyto(newcoll) - duplicates collection by copying all documents to newcoll db.osoby.converttocapped(maxbytes) - calls {converttocapped:'osoby', size:maxbytes}} command db.osoby.datasize() db.osoby.distinct( key ) - e.g. db.osoby.distinct( 'x' ) db.osoby.drop() drop the collection db.osoby.dropindex(index) - e.g. db.osoby.dropindex("indexname") or db.osoby.dropindex( {"indexkey" : 1} ) db.osoby.dropindexes() db.osoby.ensureindex(keypattern[,options]) db.osoby.find(...).count() db.osoby.find(...).limit(n) db.osoby.find(...).skip(n) db.osoby.find(...).sort(...) db.osoby.findone([query]) db.osoby.findandmodify( { update :..., remove : bool [, query: {}, sort: {}, 'new': false] } ) db.osoby.getdb() get DB object associated with collection db.osoby.getindexes() db.osoby.group( { key :..., initial:..., reduce :...[, cond:...] } ) db.osoby.insert(obj) db.osoby.mapreduce( mapfunction, reducefunction, <optional params> ) db.osoby.remove(query) db.osoby.renamecollection( newname, <droptarget> ) renames the collection. db.osoby.runcommand( name, <options> ) runs a db command with the given name db.osoby.save(obj) db.osoby.stats() db.osoby.storagesize() - includes free space allocated to this collection db.osoby.totalindexsize() - size in bytes of all the indexes db.osoby.totalsize() - storage allocated for all data and indexes db.osoby.update(query, object[, upsert_bool, multi_bool])
MongoDB. Narzędzia, transakcje, referencje 9/73 Przykładowa metoda dla kolekcji osoby Polecenie db.osoby.stats() zwraca: { "ns" : "test.osoby", "count" : 50, "size" : 24608, "avgobjsize" : 492.16, "storagesize" : 28672, "numextents" : 1, "nindexes" : 1, "lastextentsize" : 28672, "paddingfactor" : 1, "systemflags" : 1, "userflags" : 0, "totalindexsize" : 8176, "indexsizes" : { "_id_" : 8176 }, "ok" : 1 }
MongoDB. Narzędzia, transakcje, referencje 10/73 Polecenia systemowe w mongo shell Polecenia systemowe w mongo 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.
MongoDB. Narzędzia, transakcje, referencje 11/73 Skrypty w mongo shell Skrypty w mongo shell: korzystają z poleceń mongo shell i języka JavsScript, uruchamiamy z terminala: mongo [--quiet] < skrypt.js Przykład 1: skrypt.js use lab06 print('liczba dokumentów w kolekcji osoby, polecenie:'); db.osoby.count() Przykład 2: skrypt.js - wykorzystanie języka JavaScript print('nazwy wszystkich osób z kolekcji'); var cursor = db.osoby.find( {}, {_id:0,nazwa:1} ) while (cursor.hasnext()) { print(tojson(cursor.next())); }
MongoDB. Narzędzia, transakcje, referencje 12/73 Narzędzia dla bazy MongoDB Serwer MongoDB nie dostarcza narzędzia z GUI do zarządzania danymi czy ich przeglądania. Wszystkie operacje na bazie wykonuje się z wykorzytaniem mnogo shell. Narzędzi dla MongoDB jest bardzo dużo. Niektóre są komercyjne, inne darmowe, tworzone przez społeczności. Nietkóre służą do administracji, inne do przeglądania danych.
MongoDB. Narzędzia, transakcje, referencje 13/73 Narzędzia dostarczone przez zespół MongoDB MongoDB Compass (dostępne na Windows, RedHat i Ubuntu, Mac OS): graficzny przegląd danych, wykonywanie operacji CRUD na danych, szczegółowe informacje o indeksach, wykonywanie zapytań ad hoc, wyświetla graficzne plany wykonania zapytania aby ułatwić poprawę jego wydajności.
MongoDB. Narzędzia, transakcje, referencje 14/73 Narzędzia dostarczone przez zespół MongoDB MongoDB Atlas (hosting MongoDB od twórców bazy), GUI pozwala na: użycie bazy danych jako usługi, konfigurację i zarządzanie klastrem, skalowanie z automatycznym współdzieleniem, monitorowanie wykorzystania bazy uruchomionej w MongoDB Atlas, zarządzanie kopiami bezpieczeństwa i odzyskiwanie danych, konfigurowanie zabezpieczeń.
MongoDB. Narzędzia, transakcje, referencje 15/73 Narzędzia dostarczone przez zespół MongoDB MongoDB Cloud Manager: platforma do zarządzania MongoDB, działa w chmurze, monitorowanie wykorzystania baz i ustawianie określonych ostrzeżeń, automatyzacja ustawiania bazy i zarządzania nią, wizualizacja wydajności zapytań i wygodniejsze ich optymalizowanie, zarządzanie procesem automatyzacji wykonywania kopii bezpieczeństwa i odzyskiwania danych.
MongoDB. Narzędzia, transakcje, referencje 16/73 Narzędzia dostarczone przez zespół MongoDB MongoDB Stitch - pozwala na wykorzystanie bazy MongoDB jako backendu w roli usługi, konfigurujemy bakcend naszej aplikacji w chmurze, MongoDB Connector for BI (Business Intelligence) - podłączenie danych z bazy MongoDB do platformy analizy danych, do hurtowni danych (proces ETL), Ops Manager - narzędzie do zarządzania MongoDB w centrum danych (monitorowanie, automatyzacja aktualizacji czy zarządzania indeksami, tworzenie backupu, optymalizacja zapytań), MongoDB Connector for Apache Spark - pozwala na podłączenie danych z MongoDB do Apache Spark i używanie wszystkich jego bibliotek (narzędzia analityczne: zapytania w SQL, uczenie maszynowe, przetwarzanie grafów, strumieniowanie danych).
MongoDB. Narzędzia, transakcje, referencje 17/73 Darmowe narzędzia innych dostawców Mongoclient - przeglądanie danych, wsparcie przy tworzeniu zapytań, statystyki bazy mongo-express - przeglądanie i modyfikowanie danych adminmongo - działające w przeglądarce, napisane w Node.js Edda - wizualizacja logów, raczej nam się nie przyda Fluentd - narzędzie do zarządzania logami, ma integrację z MongoDB (logi są zapisywane w MongoDB) HumongouS.io - interfejs użytkownika bazy MongoDB w przeglądarce - warto sprawdzić, działa online, zakłada się konto i już, ładnie wygląda Fang of Mongo - interfejs do MongoDB w przeglądarce, chyba tylko przeglądanie danych
MongoDB. Narzędzia, transakcje, referencje 18/73 Darmowe narzędzia innych dostawców MongoHub - GUI do MongoDB pod OSX, wydaje się fajne ale nie było jak przetestować MongoVision - narzędzie do zarządzania MongoDB, działa w przeglądarce, chyba tylko do przeglądania danych MongoVUE - GUI do MongoDB napisane w.net Mongo Explorer - plugin do WebStorm NoSQL Manager for MongoDB - porządne narzędzie komercyjne, 30-dniowy trial, tylko na Windows mviewer - proste narzędzie administracyjne do MongoDB
MongoDB. Narzędzia, transakcje, referencje 19/73 Darmowe narzędzia innych dostawców PHPMoAdmin - narzędzie do administracji MongoDB napisane w PHP (tylko jeden plik) PHPmongoDB - zarządznie MongoDB w przeglądarce, napisane w PHP RockMongo - program do zarządzania MongoDB, napisany w PHP, instalka zawiera jakieś wirusy... Genghis - samodzielny program działający w przeglądarce, na bazie Ruby albo PHP, bardzo prosta funkcjonalność Meclipse - plugin do Eclipse Humongous - przeglądarka danych z MongoDb napisana w Ruby MongoDB ODA plugin for BIRT - plugin do Eclipse mongobird - z jakiejść chińskiej strony, nie udało się pobrać mongoowl - j.w. (nie udało się pobrać) Robomongo - dość proste ale wygodne GUI do zarządzania bazą MongoDB, jest zbudowane wokół mnogo shell
MongoDB. Narzędzia, transakcje, referencje 20/73 Darmowe narzędzia innych dostawców Toad Mac Edition - narzędzie do pracy z bazami danych, tutaj werjs na Mac OS, która uwzględnia też MongoDB Opricot - GUI napisne w PHP do obsługi MongoDB Moa(db) - GUI działające w przeglądarce napisane w PHP... trzeba mieć serwer PHP postawiony MongoApp - pozwala na uruchomienie MongoDB z wykorzystaniem graficznego interfejsu, działa na Mac OS Mongri - interfejs do obsługi MongoDB w przeglądarce, wykorzystuje Node.js, nic wyjątkowego MongoCMS - panel administratora dla systemów CMS napisany do użycia z MongoDB i Node.js NoSQL Viewer - tylko na windows, pozwala na przeglądanie danych ale na różne sposoby, wiele różnych baz NoSQL
MongoDB. Narzędzia, transakcje, referencje 21/73 Robo 3T (dawniej Robomongo) - przegląd i edycja danych Funkcjonalność podobna do mongo shell ale dobrze przygotowany przegląd danych (na trzy sposoby), możliwość łatwej edycji danych, wygodny wybór baz i kolekcji
MongoDB. Narzędzia, transakcje, referencje 22/73 Narzędzia komercyjne Studio 3T (Free Edition) - wcześniej MongoChef Core, najlepsze narzędzie jakie znalazłem Database Master - potężne i zrozbudowane narzędzie ale działa w.net czyli generalnie na Windows, trial działa 30 dni DbSchema - tylko na 15 dni, napisane w Javie, generuje schematy modeli danych do chyba wszystkich baz dostępnych na rynku, rozbudowane i na pewno użyteczne narzędzie... MongoDBPumper for Oracle - transfer danych między Oracle i MongoDB json Studio - komercyjne, nie ma wersji trialowej,... MongoBooster - fajne narzędzie, rozbudowane, ma darmową wersję, warto zainstalować MongoMonitor - połączenie z bazą MongoDB z iphone Mongo Management Studio - Community Edition - fajne narzędzie, działa w przeglądarce, wykorzystuje Node.js, ładne graficznie
MongoDB. Narzędzia, transakcje, referencje 23/73 MongoChef Core Studio T3 (Free Edition) - super narzędzie, warto się tym pobawić bardzo wygodny przegląd danych importowanie i eksportowanie w JSON i CSV bardzo wygodne wprowadzanie zapytań łącznie z możliwością ich graficzengo utworzenia walidacja poprawności wprowadzanych zapytań wsparcie do pracy z narzędziem mongo shell darmowa wersja do użytku niekomercyjnego statystyki wykorzystania serwera
MongoDB. Narzędzia, transakcje, referencje 24/73 MongoChef Core - przegląd danych, zapytania Lista baz i kolekcji, indeksy, zapytania z projekcją, sortowaniem i limitem
MongoDB. Narzędzia, transakcje, referencje 25/73 MongoChef Core - graficzne budowanie zapytań Mamy możliwość budowania zapytania z pomocą graficznego narzędzia
MongoDB. Narzędzia, transakcje, referencje 26/73 MongoChef Core - graficzne budowanie zapytań Ładny i czytelny przeląd statystyk serwera
MongoDB. Narzędzia, transakcje, referencje 27/73 MongoChef Core - graficzne budowanie zapytań Wsparcie dla strumienia agregacji
MongoDB. Narzędzia, transakcje, referencje 28/73 MongoBooster I Lista baz, kolekcji i indeksów, różny sposób przeglądania dokumentów
MongoDB. Narzędzia, transakcje, referencje 29/73 MongoBooster II Statystyki serwera, analiza statystyczna kolekcji, inmortowanie, eksportowanie, podgląd dokumentów w formacie JSON,...
MongoDB. Narzędzia, transakcje, referencje 30/73 Narzędzia do przeglądania danych Narzędzia do przeglądania danych: Mongs (http://whit537.org/mongs/), działa w przeglądarce vulture (sęp), działa w przeglądarce
MongoDB. Narzędzia, transakcje, referencje 31/73 Mongs - przeglądanie danych Mongs: adres: http://whit537.org/mongs/), do przelądania danych, działa w przeglądarce, na porcie 29017, napisana w języku python (framework Aspen), instalacja: $ git clone https://github.com/whit537/mongs.git $ cd mongs $ make run adres w przeglądarce: http://localhost:29017/ zapytania: http://localhost:29017/localhost/test/restaurants//3/ http://localhost:29017/localhost/test/restaurants/{"dzielnica":"queens"}/3/ http://.../restaurants/{"dzielnica":"queens","sort":[["jedzenie",-1]]}/1/
mongs - przeglądanie danych MongoDB. Narzędzia, transakcje, referencje 32/73
MongoDB. Narzędzia, transakcje, referencje 33/73 Vulture - przeglądanie danych Vulture: adres: https://github.com/didiercrunch/vulture, zaawansowane narzędzie do przelądania danych w interfejsie webowym (przeglądarka), domyślnie działa na porcie 8000, zainspirowany projektem mongs ale ma więcej funkcji, napisany w języku Go, wspiera indeksy GeoJson, pokazuje proste statystyki, udostępnia dane również po REST API, pozwala na łatwe filtrowanie danych, wspiera strumień agregacji z MongoDB, instalacja: ściąga się paczkę, rozpakowuje i uruchamia dane binarne.
Vulture - przeglądanie danych MongoDB. Narzędzia, transakcje, referencje 34/73
Vulture - przegląd wybranych pól MongoDB. Narzędzia, transakcje, referencje 35/73
MongoDB. Narzędzia, transakcje, referencje 36/73 Vulture - REST API Dane dostępne w formacie JSON (REST API), przykład dla adresu: http://localhost:8000/api/vulture%20example/vulture_example/persons/idx/0 {"document":{ "_id":"54531ba74f495b15ca8c3a4c", "address":"7881 Jewess Meadows Suite 834\nNorth Emmett, MA 77794", "birthdate":"2005-12-31", "height":138.35304345543832, "i":7550, "mail":"tschuster@gmail.com", "name":"rettie Hilpert", "position":{"coordinates":[-94.17857052555986,45.79015141455442], "type":"point"}, "sex":"f", "username":"inez40"}, "enlapsed_time":0.812593514, "meta":{ "count":10000,"indexes":[ {"keys":["_id"],"name":"_id_","unique":false}, {"keys":["$2dsphere:position"], "name":"position_2dsphere","unique":false}]} }
Vulture - statystyki MongoDB. Narzędzia, transakcje, referencje 37/73
Vulture - dane przestrzenne - OpenStreetMap MongoDB. Narzędzia, transakcje, referencje 38/73
Vulture - potok agregacji MongoDB. Narzędzia, transakcje, referencje 39/73
MongoDB. Narzędzia, transakcje, referencje 40/73 Rerferencje w MongoDB I MongoDB: nie wspiera złączeń, dane są zdenormalizowane, przechowywane z powiązanymi danymi w jednym dokumencie (nie ma potrzeby złączeń), w pewnych przypadkach sensowne jest przechowywanie powiązanych informacji w innych dokumentach (w innych kolekcjach, innych bazach danych). Dwa rodzaje przechowywania powiązań: proste referencje, ręcznie tworzone (ang. manual references) zapisujemy wartość pola _id jednego dokumentu w innym dokumencie co tworzy nam referencję, dodatkowe zapytanie pozwala nam pobrać powiązany referencją dokument, są proste i wystarczają w większości przypadków,
MongoDB. Narzędzia, transakcje, referencje 41/73 Rerferencje w MongoDB II DBRefs łączą dwa dokumenty z różnych kolekcji, a nawet różnych baz danych, używają wartości pola _id, nazwy kolekcji i opcjonalnie nazwy bazy danych, pozwala na prostsze łączenie dokumentów z jednej kolekcji z dokumentami z wielu różnych kolekcji, uzyskanie dostępu do dołączonego dokumentu wymaga dodatkowego zapytania pobierającego dołączony dokument, wiele bibliotek zawiera metody, które automatycznie tworzą zapytanie na bazie DBRefs, dostarcza wspólny format i typ reprezentujący połączenia między dokumentami, dostarcza wspólną semantykę reprezentacji połączeń między dokumentami jeśli baza danych musi komunikować się z wieloma szabonami aplikacji czy narzędziami. DBRefs używamy tylko w razie konieczności. Kiedy tylko to możliwe używamy prostych referencji.
MongoDB. Narzędzia, transakcje, referencje 42/73 Proste rerferencje Przykład dwóch kolekcji: miejsca i ludzie id = ObjectId(); db.miejsca.insert({ "_id": id, "nazwa": "Zielona Góra", "url": "http://www.zielona-gora.pl/" }) db.ludzie.insert({ "imie": "Matylda", "nazwisko": "Barańska", "pochodzenie": id }) Zapytanie do kolekcji ludzie zwraca id miejsca ich pochodznia. W razie potrzeby można te dane uzyskać kolejnym zapytaniem.
MongoDB. Narzędzia, transakcje, referencje 43/73 Proste rerferencje - dostęp do danych Pierwsze i drugie zapytanie z wynikami: db.ludzie.findone({imie:"matylda", nazwisko:"barańska"}) { "_id" : ObjectId("583c1ba1c35740bad326fb36"), "imie" : "Matylda", "nazwisko" : "Barańska", "pochodzenie" : ObjectId("583c1b9dc35740bad326fb35") } db.miejsca.findone({"_id":objectid("583c1b9dc35740bad326fb35")}) { "_id" : ObjectId("583c1b9dc35740bad326fb35"), "nazwa" : "Zielona Góra", "url" : "http://www.zielona-gora.pl/" }
MongoDB. Narzędzia, transakcje, referencje 44/73 Proste rerferencje - użycie Proste referencje: wykorzystujemy w prawie każdym przypadku, są używane zawsze, kiedy tylko wystarczają, łatwo się je tworzy, tworzone aplikacje łatwo sobie radzą z takimi referencjami. Ograniczenia Proste referencje nie przechowują nazwy kolekcji i bazy danych. Jeśli dokumenty z jednej kolekcji mają referencje na dokumenty więcej niż jednej kolekcji to można rozwazyć wykorzystanie DBRefs.
MongoDB. Narzędzia, transakcje, referencje 45/73 DBRefs DBRefs: to pewna konwencja reprezentacji dokumentów bardziej niż jakiś typ referencyjny, zawierają wartość pola _id dokumentu, nazwę kolekcji, nazwę bazy danych (w pewnych przypadkach), składają się z następujących pól: $ref - przechowuje nazwę kolekcji docelowego dokumentu, $id - przechowuje wartość pola _id docelowego dokumentu, $db - pole opcjonalne, przechowuje nazwę bazy danych z docelowym dokumentem, tylko niektóre sterowniki obsługują to pole. { "$ref" : <value>, "$id" : <value>, "$db" : <value> }
MongoDB. Narzędzia, transakcje, referencje 46/73 DBRefs - przykład Dodajemy pole znajomi (tablica) do kolekcji ludzie, które zawiera referencje do dokumentów z kolekcji osoby z bazy test. { } "_id" : ObjectId("583c1ba1c35740bad326fb36"), "imie" : "Matylda", "nazwisko" : "Barańska", "pochodzenie" : ObjectId("583c1b9dc35740bad326fb35"), "znajomi" : [ DBRef("osoby", ObjectId("566893bd2ae04f8923cb23c3"), "test") ] Kolejność pól w DBRefs ma znaczenie, nie można jej zmieniać. Nie wszystkie sterowniki mają wsparcie dla DBRefs. W niektórych trzeba przechodzić po referencjach ręcznie. Sterownik do Node.js wspiera DBRefs. Używamy klasy DBRefs i metody dereference.
MongoDB. Narzędzia, transakcje, referencje 47/73 Kilka instrukcji z DBRefs Dostęp do pól w DBRef: var zn = db.ludzie.findone( {"znajomi.$id":objectid("566893bd50873fdd7adc45a8")} ).znajomi[0] // DBRef("osoby", ObjectId("566893bd50873fdd7adc45a8")) zn // osoby 566893bd50873fdd7adc45a8 lab06 print(zn.$ref + " " + zn.$id + " " + zn.$db) db2 = db.getsiblingdb(zn.$db); coll = db2.getcollection(zn.$ref); coll.findone({"_id":zn.$id.str}); db.getsiblingdb(zn.$db).getcollection(zn.$ref).findone({"_id":zn.$id.str}); db.getsiblingdb(nazwabd) - zwraca inną bazę danych bez zmiany bieżącej w mongo shell db2.getcollection(nazwakol) - zwraca obiekt kolekcji o podanej nazwie
MongoDB. Narzędzia, transakcje, referencje 48/73 Praca z bazą danych Funkcja zwracająca ID miejsca po jego nazwie: db.miejsca.find() { "_id" : ObjectId("5839608cb048847f3cf8f11e"), "nazwa" : "Zakopane", "url" : "http://www.zakopane.pl/" } { "_id" : ObjectId("583c19c1deb9a913adfd231a"), "nazwa" : "Małe Ciche", "url" : "http://www.maleciche.pl/" }... // pobieranie id miejsca po nazwie function pobierzidmiejsca(nazwa) { id = db.miejsca.findone({"nazwa":regexp(nazwa)},{_id:1}) if(id!==null) return id._id; else return null; } pobierzidmiejsca('małe'); ObjectId("583c19c1deb9a913adfd231a")
MongoDB. Narzędzia, transakcje, referencje 49/73 Praca z bazą danych Dodawanie osoby do kolekcji, nie przekazujemy wartości wszystkich pól: function dodajosobe(imie, nazwisko, pochodznie) { db.ludzie.insert({ "imie": imie, "nazwisko": nazwisko, "pochodzenie": pochodznie }); } // dodawanie osób dodajosobe("tomasz", "Kowalkowski", pobierzidmiejsca('częstochowa')); dodajosobe('klara', 'Słoczyńska', ObjectId("583c18d2deb9a913adfd2312"));... { "_id" : ObjectId("583c56a7c35740bad326fb38"), "imie" : "Tomasz","nazwisko" : "Kowalkowski", "pochodzenie" : ObjectId("583c186bdeb9a913adfd230c") } { "_id" : ObjectId("583c57b2c35740bad326fb39"), "imie" : "Klara", "nazwisko" : "Słoczyńska", "pochodzenie" : ObjectId("583c18d2deb9a913adfd2312") }
MongoDB. Narzędzia, transakcje, referencje 50/73 Praca z bazą danych Pobieranie ID osoby po jej imieniu i nazwisku: // pobieranie ID osoby function pobierzidosoby(imie, nazwisko) { id = db.ludzie.findone({"imie":imie,"nazwisko":nazwisko},{_id:1}) if(id!==null) return id._id; else return null; } pobierzidosoby('tomasz', 'Kowalkowski') ObjectId("583c56a7c35740bad326fb38") pobierzidosoby('tomasz', 'Kowalkowskii') null
ongodb. Narzędzia, transakcje, referencje 51/73 Praca z bazą danych Dodawanie miejsca, określamy nazwę i adres URL strony: // dodawanie miejsca function dodajmiejsce(nazwa, url) { id = ObjectId(); db.miejsca.insert({ "_id": id, "nazwa": nazwa, "url": url }); return id; } dodajmiejsce("zamość", "http://www.zamosc.pl/") db.miejsca.find()... { "_id" : ObjectId("583c5866c35740bad326fb3a"), "nazwa" : "Zamość", "url" : "http://www.zamosc.pl/" }
MongoDB. Narzędzia, transakcje, referencje 52/73 Praca z bazą danych Lista osób pochodzących z konkretnej miejscowości: function listaosob(pochodzenie) { var idmiejsca = db.miejsca.findone({nazwa:pochodzenie})._id; print(idmiejsca); var cur = db.ludzie.find({"pochodzenie":idmiejsca},{_id:0}); print('lista OSÓB Z '+ pochodzenie.touppercase()); while (cur.hasnext()) { var os = cur.next(); print(os.imie+" "+os.nazwisko); } } listaosob('częstochowa') LISTA OSÓB Z CZĘSTOCHOWA Tomasz Kowalkowski Bartosz Rolnik Kamila Bartosik...
MongoDB. Narzędzia, transakcje, referencje 53/73 Składowanie kodu JavaScript w bazie danych Kod JavaScript przechowywany na serwerze JavaScript jest bardzo ważnym językiem dla MongoDB. Mongo shell korzysta z języka JavaScript. Server posiada również wbudowany interpreter JavaScript używany m.in. w: Map/Reduce funkcji db.eval() klauzuli $where Istnieje możliwość przechowywania funkcji zapisanych w JavaScript na serwerze i wywoływanie ich. Funkcje zapisywane są w specjalnej kolekcji system.js. Zawartość kolekcji system.js można przeglądać, modyfikować, usuwać jak każdą inną kolekcję.
MongoDB. Narzędzia, transakcje, referencje 54/73 Składowanie kodu JavaScript w bazie danych - uwagi Kod JavaScript przechowywany na serwerze Nie powinno się przechowywać logiki aplikacji w bazie danych. Przechowywanie kodu JavaScript na serwerze ma ograniczenia wydajnościowe. Kod aplikacji jest zwykle najbardziej wydajny, jeśli rozwija się razem z aplikacją, ma ten sam system kontroli wersji.
MongoDB. Narzędzia, transakcje, referencje 55/73 Składowanie kodu JavaScript w bazie danych Poniższy kod przykładowej funkcji function sumaliczb(a, b) { return a+b; } sumaliczb(12, 9) można zapisać w bazie, w kolekcji system.js db.system.js.save({ _id:"dodajliczby", value:function(a, b){ return a+b; } }); i uruchomić, np. poniższym poleceniem db.eval("dodajliczby(2, 3);"); // db.eval(dodajliczby, 12, 7); // wczytywanie funkci z serwera i uruchamianie ich na w mongo shell db.loadserverscripts(); dodajliczby(7, 5);
MongoDB. Narzędzia, transakcje, referencje 56/73 Funkcja eval() Funkcja eval(funkcja, [arg1, arg2,...]): porzucona w wersji 3.0 działa, ale jej użycie jest niezalecane, pozwala na wykonanie się kodu JavaScript na serwerze, domyślnie blokuje całą bazę danych na czas działania, nie można używać na kolekcjach współdzielonych (ang. sharding), powinno się jej unikać jeśli w klastrze mamy wspódzielone dane, jednak można używać na niewspółdzielonych kolekcjach i bazach danych, nawet jeśli klaster jest ze współdzieleniem. db.eval( function (a, b) { print("hello on MongoDB server"); return a+b; }, 12, 3); 15
MongoDB. Narzędzia, transakcje, referencje 57/73 Zawartość kolekcji system.js db.system.js.save({ _id: "hello", value : function() { print("hello World"); return "Witaj Świecie"; } }); db.system.js.save({ _id:"dodajliczby", value:function(a, b){ return a+b; } }); db.eval("hello()"); // wykonuje się na serwerze db.loadserverscripts(); hello(); // wczytana z serwera, wykonuje się w mongo shell Zawartość kolekcji system.js: pole _id zawiera nazwę funkcji, jest unikalne w obszarze bazy danych, pole value zawiera definicję funkcji, nie jako tekst ale jako funkcję.
MongoDB. Narzędzia, transakcje, referencje 58/73 Zapytania z polami tablic > db.tabs.find() > db.tabs.insert({tab:[1,2,3,4,5,7]}) > db.tabs.insert({tab:[3,4,5]}) > db.tabs.insert({tab:[1,4,8,12]}) > db.tabs.insert({tab:[7,8,9,10]}) > db.tabs.find({},{_id:0}) { "tab" : [ 1, 2, 3, 4, 5, 7 ] } { "tab" : [ 3, 4, 5 ] } { "tab" : [ 1, 4, 8, 12 ] } { "tab" : [ 7, 8, 9, 10 ] } > db.tabs.find({"tab":{"$lt":4}}).count() // 3 > db.tabs.find({"tab":{"$lte":4}}).count() // 3 > db.tabs.find({"tab":{"$gt":4}}).count() // 4 > db.tabs.find({"tab":{"$gte":4}}).count() // 4 > db.tabs.find({"tab":{$not:{"$lte":4}}}).count() // 1 > db.tabs.find({"tab":{$not:{"$gt":4}}}).count() // 0
MongoDB. Narzędzia, transakcje, referencje 59/73 Tablice w kolekcji restauracji // Liczba wszystkich restauracji, z polem punkty i bez niego > db.restaurants.count({}) // 25355 > db.restaurants.count({"oceny.punkty":{$exists:1}}) // 24618 > db.restaurants.count({"oceny.punkty":{$exists:0}}) // 737 // Liczba restauracji posiadających ocenę mniejszą/większą lub równą 10 > db.restaurants.count({ "oceny.punkty": {$lte: 10} }) // 21053 > db.restaurants.count({ "oceny.punkty": {$gte: 10} }) // 21163 // Liczba restauracji nie posiadających oceny większej/mniejszej niż 10 > db.restaurants.count({ "oceny.punkty": {$not: {$gt: 10} } }) // 5754 > db.restaurants.count({ "oceny.punkty": {$not: {$lt: 10} } }) // 6292
MongoDB. Narzędzia, transakcje, referencje 60/73 Obsługa transakcji w MongoDB W MongoDB: operacje zapisu są atomowe na poziomie dokumentu nawet jeśli zapis modyfikuje wiele zagnieżdżonych dokumentów wewnątrz jednego dokumentu, polecenie modyfikujące wiele dokumentów jest atomowe na każdym dokumencie z osobna, ale operacja w całości atomowa nie jest, zapisy poszczególnych dokumentów mogą się przeplatać z operacjami zapisu innego polecenia, operator $isolated pozwala izolować pojedyncze polecenie zapisu, które dotyczy wielu dokumentów operator $isolated powoduje, że operacja zapisu uzyskuje wyłączny dostęp do kolekcji, operator $isolated nie działa na klastrach ze współdzieleniem (dane podzielone na różne serwery),
MongoDB. Narzędzia, transakcje, referencje 61/73 Semantyka zbliżona do transakcji Ponieważ jeden dokument może zawierać wiele zagnieżdżonych dokumentów, to atomowość operacji na pojedynczym dokumencie zwykle wystarcza w wielu praktycznych przypadkach. Dla przypadków, w których ciąg operacji zapisu musi być wykonany jak w jednej transakcji, można zaimplementować dwustopniowe zatwierdzenie (ang. two-phase commit). Dwustopniowe zatwierdzenie oferuje semantykę tylko zbliżoną do transakcji, zapewnia spójność danych ale jest możliwe, że aplikacja zwróci pośrednie dane (pomiędzy tymi dwoma fazami) albo wykona rollback.
MongoDB. Narzędzia, transakcje, referencje 62/73 Kontrola współbieżności Współbieżność pozwala na działanie różnym aplikacjom w tym samym czasie bez występowania konfliktów czy niespójności danych. Dwa podejścia obsługi współbieżności w MongoDB: jedno podejście zapewniające spójność polega na tworzeniu indeksów unikalnych na polach, w których wartości nie mogą się powtarzać, zapobiega to tworzeniu się powielonych wartości przy wstawianiu czy aktualizacji dokumentów, inne podejście wymaga określenia oczekiwanej biażącej wartości pola w predykacie zapytania operacji zapisu, dwustopniowe zatwierdzanie wprowadza pewną wariację tego rozwiązania, w której predykat zawiera identyfikator aplikacji jak również oczekiwaną bieżącą wartość pola podczas przeprowadania operacji zapisu.
MongoDB. Narzędzia, transakcje, referencje 63/73 Dwustopniowa operacja zapisu W MongoDB: wzorzec wykonywania aktualizacji danych na wielu dokumentach, coś jak transakcja na wielu dokumentach używamy dwustopniowej operacji zapisu (ang. two-phase commit) przy zapisie danych do wielu dokumentów dodatkowo można rozszerzyć ten proces do uzyskania funkcjonalności zbliżonej do polecenia rollback
MongoDB. Narzędzia, transakcje, referencje 64/73 Dwustopniowa operacja zapisu Przy wykonywaniu transakcji składających się z operacji sekwencyjnych, pojawiają się pewne uwagi: atomowość: jeśli jakaś operacja zakończy się niepowodzeniem, wcześniejsze operacje w transakcji muszą zostać wycofane, trzeba zrobić rollback do wcześniejszego stanu, spójność: w przypadku poważnych problemów (sieć, sprzęt), które przeszkodziły transakcji, baza danych musi być w stanie odzyskać wcześniejszy stan spójności. Dwustopniowe zatwierdzanie pozwala na wsparcie dla aktualizacji danych w wielu dokumentach. Dwustopniowe zatwierdzanie zapewnia, że dane w bazie będą spójne i, w przypadku błędów, stan przed rozpoczęciem transakcji jest osiągalny. Podczas wykonywana tego dwustopniowego zatwierdzania dokumenty są w stanie zawieszenia, nie są dostępne.
MongoDB. Narzędzia, transakcje, referencje 65/73 Dwustopniowa operacja zapisu Przygotowanie kont, na których będzie operacja przelewu db.accounts.insert( [ { _id: "A", balance: 1000, pendingtransactions: [] }, { _id: "B", balance: 1000, pendingtransactions: [] } ] ) db.accounts.find() { } { } "_id" : "A", "balance" : 1000.0, "pendingtransactions" : [ ] "_id" : "B", "balance" : 1000.0, "pendingtransactions" : [ ]
MongoDB. Narzędzia, transakcje, referencje 66/73 Dwustopniowa operacja zapisu Inicjalizacja transakcji db.transactions.insert( { _id: 1, source: "A", destination: "B", value: 100, state: "initial", lastmodified: new Date() } ) db.transactions.findone() { } "_id" : NumberInt(1), "source" : "A", "destination" : "B", "value" : NumberInt(100), "state" : "initial", "lastmodified" : ISODate("2016-11-22T08:15:04.244+0000")
MongoDB. Narzędzia, transakcje, referencje 67/73 Dwustopniowa operacja zapisu 1. Pobieramy transakcję w celu jej rozpoczęcia var t = db.transactions.findone( { state: "initial" } ) t { } "_id" : NumberInt(1), "source" : "A", "destination" : "B", "value" : NumberInt(100), "state" : "initial", "lastmodified" : ISODate("2016-11-22T08:15:04.244+0000")
MongoDB. Narzędzia, transakcje, referencje 68/73 Dwustopniowa operacja zapisu 2. Zmiana stanu transakcji na w toku db.transactions.update( { _id: t._id, state: "initial" }, { $set: { state: "pending", lastmodified: new Date() } } ) db.transactions.findone() { } "_id" : NumberInt(1), "source" : "A", "destination" : "B", "value" : NumberInt(100), "state" : "pending", "lastmodified" : ISODate("2016-11-22T08:19:48.637+0000")
MongoDB. Narzędzia, transakcje, referencje 69/73 Dwustopniowa operacja zapisu 3 - Apply the transaction to both accounts db.accounts.update( { _id: t.source, pendingtransactions: { $ne: t._id } }, { $inc: { balance: -t.value }, $push: { pendingtransactions: t._id } } ) db.accounts.update( { _id: t.destination, pendingtransactions: { $ne: t._id } }, { $inc: { balance: t.value }, $push: { pendingtransactions: t._id } } ) db.accounts.find().pretty() { } { } "_id" : "A", "balance" : 900.0, "pendingtransactions" : [ 1.0 ] "_id" : "B", "balance" : 1100.0, "pendingtransactions" : [ 1.0 ]
MongoDB. Narzędzia, transakcje, referencje 70/73 Dwustopniowa operacja zapisu 4 - Update transaction state to wykonana db.transactions.update( { _id: t._id, state: "pending" }, { $set: { state: "applied", lastmodified: new Date() } } ) db.transactions.findone() { } "_id" : NumberInt(1), "source" : "A", "destination" : "B", "value" : NumberInt(100), "state" : "applied", "lastmodified" : ISODate("2016-11-22T08:23:58.076+0000")
MongoDB. Narzędzia, transakcje, referencje 71/73 Dwustopniowa operacja zapisu 5 - Update both accounts list of pending transactions db.accounts.update( { _id: t.source, pendingtransactions: t._id }, { $pull: { pendingtransactions: t._id } } ) db.accounts.update( { _id: t.destination, pendingtransactions: t._id }, { $pull: { pendingtransactions: t._id } } ) db.accounts.find().pretty() { } { } "_id" : "A", "balance" : 900.0, "pendingtransactions" : [ ] "_id" : "B", "balance" : 1100.0, "pendingtransactions" : [ ]
MongoDB. Narzędzia, transakcje, referencje 72/73 Dwustopniowa operacja zapisu - zakończenie transakcji 6. Zmiania statusu transakcji na zakończona db.transactions.update( { _id: t._id, state: "applied" }, { $set: { state: "done", lastmodified: new Date() } } ) db.transactions.findone() { } "_id" : NumberInt(1), "destination" : "B", "lastmodified" : ISODate("2016-11-22T08:26:34.483+0000"), "source" : "A", "state" : "done", "value" : NumberInt(100)
MongoDB. Narzędzia, transakcje, referencje 73/73 Źródła https://docs.mongodb.com/ecosystem/tools/ administration-interfaces/ https://docs.mongodb.com/ecosystem/drivers/ https://www.npmjs.com/search?q=mongo https://mongodb.github.io/node-mongodb-native/ http://meritt.github.io/easymongo/ http://3t.io/mongochef/ https://mongobooster.com/ http://dirolf.com/2010/04/05/ stored-javascript-in-mongodb-and-pymongo.html http://pointbeing.net/weblog/2010/08/ getting-started-with-stored-procedures-in-mongodb.html