ongodb. Narzędzia i biblioteki 1/99 MongoDB. Narzędzia i biblioteki Technologie Zarządzania Treścią dr inż. Robert Perliński rperlinski@icis.pcz.pl Politechnika Częstochowska Instytut Informatyki Teoretycznej i Stosowanej 29 listopada 2016
MongoDB. Narzędzia i biblioteki 2/99 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 Biblioteki do pracy z MongoDB mongodb easymongo mongoose 5 Transakcje 6 Zapytania z polami tablic 7 Referencje w MongoDB 8 Źródła
MongoDB. Narzędzia i biblioteki 3/99 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 i biblioteki 4/99 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 i biblioteki 5/99 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 i biblioteki 6/99 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 i biblioteki 7/99 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 i biblioteki 8/99 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 i biblioteki 9/99 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 i biblioteki 10/99 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 i biblioteki 11/99 Narzędzia dostarczone przez zespół MongoDB MongoDB Compass (dostępne na Windows i 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 i biblioteki 12/99 Narzędzia dostarczone przez zespół MongoDB MongoDB Atlas (hosting MongoDB od twórców bazy), GUI pozwala na: 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 i biblioteki 13/99 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 i biblioteki 14/99 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 i biblioteki 15/99 Darmowe narzędzia innych dostawców UMongo - napisany w Javie, nierozwijany, trochę przestarzały ale ma bogatą funkcjonalność 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 i biblioteki 16/99 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 i biblioteki 17/99 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 i biblioteki 18/99 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 i biblioteki 19/99 Narzędzia komercyjne 3T MongoChef (Free Edition) - 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 i biblioteki 20/99 MongoChef Core MongoChef Core (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 i biblioteki 21/99 MongoChef Core - przegląd danych, zapytania Lista baz i kolekcji, indeksy, zapytania z projekcją, sortowaniem i limitem
MongoDB. Narzędzia i biblioteki 22/99 MongoChef Core - graficzne budowanie zapytań Mamy możliwość budowania zapytania z pomocą graficznego narzędzia
MongoDB. Narzędzia i biblioteki 23/99 MongoChef Core - graficzne budowanie zapytań Ładny i czytelny przeląd statystyk serwera
MongoDB. Narzędzia i biblioteki 24/99 MongoChef Core - graficzne budowanie zapytań Wsparcie dla strumienia agregacji
MongoDB. Narzędzia i biblioteki 25/99 MongoBooster I Lista baz, kolekcji i indeksów, różny sposób przeglądania dokumentów
MongoDB. Narzędzia i biblioteki 26/99 MongoBooster II Statystyki serwera, analiza statystyczna kolekcji, inmortowanie, eksportowanie, podgląd dokumentów w formacie JSON,...
MongoDB. Narzędzia i biblioteki 27/99 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 i biblioteki 28/99 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 i biblioteki 29/99
MongoDB. Narzędzia i biblioteki 30/99 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 i biblioteki 31/99
Vulture - przegląd wybranych pól MongoDB. Narzędzia i biblioteki 32/99
MongoDB. Narzędzia i biblioteki 33/99 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 i biblioteki 34/99
Vulture - dane przestrzenne - OpenStreetMap MongoDB. Narzędzia i biblioteki 35/99
Vulture - potok agregacji MongoDB. Narzędzia i biblioteki 36/99
MongoDB. Narzędzia i biblioteki 37/99 Pakiety npm związane z MongoDB Na stronie https://www.npmjs.com jest 4800 wyników dla słowa mongo. Niektóre wybrane biblioteki: mongodb - oficjalny sterownik MongoDB - https://www.npmjs.com/package/mongodb mongoose - dobry do REST API itp. działa na schematach - https://www.npmjs.com/package/mongoose mongojs - emuluje oficjalne API, łatwo używać - https://www.npmjs.com/package/mongojs mongo-querystring - zapytania zapisane w adresie URL są zamieniane na obiekty zapytania - https://www.npmjs.com/package/mongo-querystring easymongo - bardzo prosta w użyciu, udostępnia najważniejsze operacje na kolekcjach, wystarczy do podstawowej pracy - https://www.npmjs.com/package/easymongo
MongoDB. Narzędzia i biblioteki 38/99 Oficjalny sterownik MongoDB dla Node.js Oficjalny sterownik MongoDB dla Node.js: oferuje obsługę bazy MongoDB za pomocą wywołań zwrotnych oraz obietnic, pozwala to na wykorzystanie wszystkich zalet ES6, zawiera wsparcie dla specyfikacji wspóldzielonego API CRUD zawiera wsparcie dla Server Discovery and Monitoring Specification, obecna wersja sertownika to 2.2, https://mongodb.github.io/node-mongodb-native/ instalacja: npm install mongodb --save
MongoDB. Narzędzia i biblioteki 39/99 Najważniejsze metody klasy Collection I Najważniejsze metody klasy Collection (większość zwraca obietnice): aggregate(pipeline, options, callback) - wykonuje potok agregacji, zwraca AggregationCursor, count(query, options, callback) - zwraca liczbę dokumentów spełniających zapytanie, createindex(fieldorspec, options, callback) - tworzy indeks na danej kolekcji, dropindex(indexname, options, callback) - usuwa indeks z danej kolekcji, find(query) - tworzy kursor, którego używamy do pobrania danych, findone(query, options, callback) - pobiera jeden dokument, pozostałe: findandmodify, findandremove, findoneanddelete, findoneandreplace, findoneandupdate deleteone(filter, options, callback) - usuwa jeden dokument,
MongoDB. Narzędzia i biblioteki 40/99 Najważniejsze metody klasy Collection II deletemany(filter, options, callback) - usuwa naraz wiele dokumentów, insertone(doc, options, callback) - wstawia pojedynczy dokument, insertmany(docs, options, callback) - wstawia naraz wiele dokumentów, updateone(filter, update, options, callback), updatemany(filter, update, options, callback), drop(options, callback) - usuwa całą kolekcję, remove(selector, options, callback) - usuwa dokument lub dokumenty, przestarzała, rename(newname, options, callback) - zmienia nazwę kolekcji, replaceone(filter, doc, options, callback) - zamienia dopasowany na podany dokument.
MongoDB. Narzędzia i biblioteki 41/99 Najważniejsze metody klasy Cursor I Najważniejsze metody klasy Cursor (większość zwraca obietnice): count(applyskiplimit, options, callback) - liczba dokumentów tego kursora, each(callback) - iteruje po wszystkich elementach kursora, zaczyna od bieżącego położenia kursora, foreach(iterator, callback) - przechodzi przez wszystkie dokumenty kursora używając iteratora (w szablonie funkcji zwrotnej), hasnext(callback) - sprawdza czy są w kursorze jeszcze jakieś dokumenty, next(callback) - pobiera następny dokument z kursora albo zwraca null jeśli brak, toarray(callback) - zwraca całą tablicę dokumentów, które są pod kursorem, filter(filter) - pozwala na ustawienie zapytania, które ustala dokumenty kursora, project(value) - ustala pola dokumentów dostępnych przez kursor.
MongoDB. Narzędzia i biblioteki 42/99 Połączenie się z bazą danych w adresie url określamy: sterownik, nazwę hosta, port i bazę danych, z którą chcemy się połączyć, metoda connect() wykorzystuje adres url, po połączeniu wywołuje funkcję mającą dostęp do bazy (obiekt db) albo zwraca błąd (err) db.close() - zamyka połączenie var MongoClient = require('mongodb').mongoclient, assert = require('assert'); // Dane do połączenia w adresie URL var url = 'mongodb://localhost:27017/lab08'; MongoClient.connect(url, function(err, db) { assert.equal(null, err); console.log("nawiązano połączenie z serwerem"); //... db.close(); });
MongoDB. Narzędzia i biblioteki 43/99 Pobranie danych z kolekcji łączymy się z bazą, obiekt db przekazujemy do tworzonej funkcji wywołanie funkcj zwrotnie zamknie połączenie z bazą danych MongoClient.connect(url, function(err, db) { assert.equal(null, err); console.log("nawiązano połączenie z serwerem"); listamiejsc(db, function() { db.close(); }); }); Lista miejsc: [ { _id: 583c99f27ef6aaeb8d657ee6, nazwa: 'Zielona Góra', url: 'http://www.zielona-gora.pl/' },... ]
MongoDB. Narzędzia i biblioteki 44/99 Pobranie danych z kolekcji - find().toarray() funkcja listamiejsc posiada dwa parametry: db - pozwoli na dostęp do bazy danych, callback - wywołanie zwrotne, pozwoli zamknąć połączenie z bazą metoda db.collection(<kol>) pozwala na dostęp do wybranej kolekcji metoda find() zwraca kursor kursor poprzez metodę toarray() zwraca tablicę dokumentów albo błąd, trzeba zapewnić odpowiedną ilość pamięci do przechowania wyników var listamiejsc = function(db, callback) { var collection = db.collection('miejsca'); } collection.find({}).toarray(function(err, miejsca) { assert.equal(err, null); console.log("lista miejsc:"); console.log(miejsca) callback(); // callback(miejsca); });
MongoDB. Narzędzia i biblioteki 45/99 Pobranie danych z kolekcji - find().next() tworzymy kursor metodą find() wykorzystując kursor odczytujemy tylko jeden dokument metoda next() kursora pozwala na dostęp do jednego pobranego dokumentu z pobranego dokumenty wyświetlamy nazwę i adres url var listamiejsc2 = function(db, callback) { var collection = db.collection('miejsca'); } var cur = collection.find({}); console.log("lista miejsc:"); cur.next(function(err, m) { assert.equal(err, null); console.log(m.nazwa+" - "+m.url); callback(); // callback(miejsca); }); Lista miejsc: Zielona Góra - http://www.zielona-gora.pl/
MongoDB. Narzędzia i biblioteki 46/99 Pobranie danych z kolekcji - find().each() tworzymy kursor metodą find() wykorzystując kursor odczytujemy wszystkie dokumenty, jeden po drugim metoda each() kursora przechodzi przez całą kolekcję z pobranego dokumenty wyświetlamy nazwę i adres url var listamiejsc3 = function(db, callback) { var collection = db.collection('miejsca'); // var cur = collection.find({}); // pakiet 'node-regexp' var cur = collection.find({nazwa:regexp().end("wa").toregexp()}); console.log("lista miejsc:"); cur.each(function(err, m) { assert.equal(err, null); if(m!==null) console.log(m.nazwa+" - "+m.url); callback(); // callback(miejsca); }); } Lista miejsc: Warszawa - http://www.warszawa.pl/ Częstochowa - http://www.czestochowa.pl/
MongoDB. Narzędzia i biblioteki 47/99 Dodawanie pojedynczego dokumentu - insertone() metoda indertone() zwraca błąd albo liczbę dodanych dokumentów, posiada dwa parametry nie ma tutaj wywołania zwrotnego po zakończeniu dodawania var dodajmiejsce = function(db, callback) { var collection = db.collection('miejsca'); } collection.insertone( {nazwa:"zamość", url:"http://www.zamosc.pl/"}, function(err, r) { assert.equal(null, err); assert.equal(1, r.insertedcount); } ); db.close(); console.log("dodano dokument");
MongoDB. Narzędzia i biblioteki 48/99 Usunięcie pojedynczego dokumentu - deleteone() metoda deleteone() zwraca błąd albo liczbę usuniętych dokumentów, posiada dwa parametry nie ma tutaj wywołania zwrotnego po zakończeniu dodawania var usunmiejsce = function(db, idmiejsca, callback) { var collection = db.collection('miejsca'); } collection.deleteone({_id: idmiejsca}, function(err, r) { assert.equal(null, err); assert.equal(1, r.deletedcount); db.close(); console.log("usunięto dokument"); }); // wywołanie usunmiejsce(db, ObjectID("583cf53635c763404b57c13b"));
MongoDB. Narzędzia i biblioteki 49/99 Modyfikacja pojedynczego dokumentu - updateone() metoda updateone() zwraca błąd albo liczbę zmodyfikowanych dokumentów, posiada trzy parametry nie ma tutaj wywołania zwrotnego po zakończeniu dodawania var dodajkraj = function(db, miejsce, kraj, callback) { var collection = db.collection('miejsca'); collection.updateone( {"nazwa":miejsce}, {$set: {"kraj": kraj}}, function(err, r) { assert.equal(null, err); assert.equal(1, r.matchedcount); assert.equal(1, r.modifiedcount); db.close(); console.log("dodano nazwę kraju"); } ); } // wywołanie dodajkraj(db, "Warszawa", "Polska");
MongoDB. Narzędzia i biblioteki 50/99 easymongo easymongo: prosta biblioteka do obsługi MongoBD z Node.js jest nadbudówką dla oficjalnego sterownika do MongoDB napisana na licencji MIT instalacja: npm i --save easymongo składa się z dwóch klas: Client i Collection https://github.com/meritt/easymongo http://meritt.github.io/easymongo/
MongoDB. Narzędzia i biblioteki 51/99 easymongo - klasa Collection Konstruktor klasy Client(serwer, [opcje]), posiada dwa argumenty: serwer - ustawienia połączenia do serwera string zawierający URL połączenia mongodb://[username:password@]host1[:port1][/[database][?options]] obiekt JSON określający serwer {host: host1, port:27017, dbname: database } [opcje] - określa opcje połączenia, opcjonalny, Klasa Client, metody: collection(nazwa) - zwraca nową instancję klasy Collection, open(nazwa) - zwraca obietnicę, która pozwala na dostęp do kolekcji bazy MongoDB o podanej nazwie, close() - zamyka połączenie z bazą MongoDB.
MongoDB. Narzędzia i biblioteki 52/99 easymongo - przygotowanie Dostęp do bazy MongoDB: const Client = require('easymongo'); var mongo = new Client({dbname: 'uczelnia'}); // var mongo = new Client({host: 'localhost', port:27017, dbname: 'uczelnia'}); // var mongo = new Client('mongodb://localhost:27017/uczelnia'); var pracownicy = mongo.collection('pracownicy'); zwracamy klasę klienta do bazy MongoDB (Client), wykorzystujemy konstruktor klasy MongoClient(), do połączenia się z bazą, tworzymy nową instancję klasy Collection dla kolekcji pracownicy.
MongoDB. Narzędzia i biblioteki 53/99 easymongo - klasa Collection Klasa Collection, metody: find([war][, opcje]) - zwraca tablicę dokumentów spełniających podany warunek, findone([war][, opcje]) - zwraca pierwszy dokument spełniający podany warunek, findbyid(oid[, pola]) - zwaraca dokument o podanym ID, save(data) - zapisuje podany dokument w kolekcji, update(war, data) - aktualizuje dokumenty spełniające warunek, remove([war]) - usuwa dokument według podanych parametrów, removebyid(oid) - usuwa dokument po jesto ID, count([war]) - zwaraca liczbę dokumentów spełniających warunek podany w parametrach. Wszystkie metody zwracają obietnice.
MongoDB. Narzędzia i biblioteki 54/99 easymongo - klasa Collection, opcje metody find() Klasa Collection, opcje dostępne dla metod z rodziny find(): limit - określamny limit liczby zwracanych dokumentów, skip - podajemy, ile dokumentów ma być pominiętych, sort - pozwala ustalić kolejność zwracanych dokumentów, fields - podajemy w tablicy, które pola dokumetów mają być zwracane.
MongoDB. Narzędzia i biblioteki 55/99 Klasa ObjectID z oficjalnego sterownika Konstruktor klasy ObjectID() tworzy nowy obiekt z unikalnym numer dokumentu do bazy MongoDB: var ObjectID = require('mongodb').objectid, assert = require('assert'); // Tworzy nowy ObjectID var objectid = new ObjectID(); // Sprawdza czy zapis heksadecymalny jest 24 znakowy assert.equal(24, objectid.tohexstring().length); Dokumentacja: https://mongodb.github.io/node-mongodb-native/api-bson-generated/objectid.html
MongoDB. Narzędzia i biblioteki 56/99 easymongo - save() Metoda save(): app.get('/zapisz', function (req, res) { var data = { imie: 'Wojciech', nazwisko: 'Kowalski', url: 'http://kowalski.pcz.pl'}; // var data = { imie: 'Wojciech', nazwisko: 'Kowalski', url: 'http://kowalski.pcz.pl', rand: Math.random()}; // var data = {_id: new ObjectID(), imie: 'Wojciech', nazwisko: 'Kowalski', url: 'http://kowalski.pcz.pl'}; pracownicy.save(data).then(function(result) { console.log(result); res.send('dane pracownika zostały zapisane'); }); }) Zapisane dane: { _id: 582f032d67aec631b5420470, imie: 'Wojciech', nazwisko: 'Kowalski', url: 'http://kowalski.pcz.pl' }
MongoDB. Narzędzia i biblioteki 57/99 easymongo - find() Metoda find(): app.get('/znajdz', function (req, res) { pracownicy.find({imie: 'Wojciech'}, {limit: 5, sort:{nazwisko:1}).then(function(result) { // Zawsze zwraca tablicę dokumentów console.log(result); res.send('dane pracownika zostały znalezione'); }); }) Znalezione dane: [ { _id: 582f032d67aec631b5420470, imie: 'Wojciech', nazwisko: 'Kowalski', url: 'http://kowalski.pcz.pl' }, { _id: 582f0374a53b1b31db27128e, imie: 'Wojciech', nazwisko: 'Nowak', url: 'http://kowalski.pcz.pl' } ]
MongoDB. Narzędzia i biblioteki 58/99 easymongo - findbyid() Metoda findbyid(): app.get('/znajdzpoid', function (req, res) { pracownicy.findbyid('582f032d67aec631b5420470').then(function(result) { // Zwraca pobrany dokument albo false w przypadku błędu console.log(result); res.send('pracownik został znaleziony'); }); }) Znaleziony dokument: { _id: 582f032d67aec631b5420470, imie: 'Wojciech', nazwisko: 'Kowalski', url: 'http://kowalski.pcz.pl'
ongodb. Narzędzia i biblioteki 59/99 easymongo - count() Metoda count(): app.get('/policz', function (req, res) { pracownicy.count({imie: 'Wojciech'}).then(function(result) { // Zwraca liczbę dokumentów albo 0 jeśli błąd console.log(result); res.send('zwrócono liczbę dokumentów'); }); }) Wynik: 2
ongodb. Narzędzia i biblioteki 60/99 easymongo - remove() Metoda remove(): app.get('/usun', function (req, res) { pracownicy.remove({imie: 'Wojciech'}).then(function(result) { // Zwraca wynik operacji (wartość logiczna). Jeśli błąd to zwraca false. console.log(result); res.send('usunięto dokumenty'); }); }) Wynik: true
MongoDB. Narzędzia i biblioteki 61/99 mongoose http://mongoosejs.com/ Tworzenie walidacji dla MongoDB, rzutowania i szablonou logiki biznesowej jest... dużym obciążeniem. Dletego używamy gotywych bibliotek, np. mongoose. Mongoose - biblioteka dla Node.js udostępniająca mapowanie obiektowe (podobne do ORM) z interfejsem znanym z Node.js. W mongoose jest Object Data Mapping (ODM) - zmiana danych z bazy do obiektów JavaScript do użycia w aplikacji. Mongoose dostarcza gotowe rozwiązanie do modelowania danych aplikacji. Zawiera wbudowane rzutowanie typów, walidację, budowanie zapytań, gotowe, praktyczne rozwiązania dla logiki biznesowej i wiele innych.
MongoDB. Narzędzia i biblioteki 62/99 mongoose - sposób działania I Trzeba zainstalować mongoose w projekcie: npm install mongoose Dołączamy mongoose do projektu i łączymy się z bazą danych test (zostanie utworzona jeśłi takiej nie było): var mongoose = require('mongoose'); mongoose.connect('mongodb://localhost/test'); Sprawdzamy czy połączenie się udało: var db = mongoose.connection; db.on('error', console.error.bind(console, 'błąd połączenia...')); db.once('open', function() { // połączenie udane! }); W mongoose wszystko zaczyna się od schematu: var friendschema = mongoose.schema({ nazwa: String }); Mając schemat, na jego bazie tworzymy model var Friend = mongoose.model('friend', friendschema);
MongoDB. Narzędzia i biblioteki 63/99 mongoose - sposób działania II Na bazie modułu tworzymy dokumenty (zawierają pola i typy jak w schemacie): var franek = new Friend({ nazwa: 'Franek' }); console.log(franek.nazwa); // 'Franek' Przyjaciele mogą się witać - zobaczmy, jak dodać funkcjonalność do naszych dokumentów: // metody należy dodać do schematu ZANIM utworzy się z niego model friendschema.methods.sayhello = function () { var powitanie = this.nazwa? "Cześć, mam na imię " + this.nazwa : "Witaj, nie wiem jak się nazywam..."; console.log(powitanie); } Funkcja dodana do pola methods schematu i wykorzystana w modelu jest dostępna w każdym utworzonym dokumencie var jola = new Friend({ nazwa: 'Jolanta' }); jola.sayhello(); // "Cześć, mam na imię Jolanta"
MongoDB. Narzędzia i biblioteki 64/99 mongoose - sposób działania III Zapis dokumentów w bazie odbywa się dzięki metodzie save(): // pierwszy argument odpowiada za błędy jola.save(function (err, jola) { if (err) return console.error(err); jola.sayhello(); }); Odczyt dokumentów zapisanych w bazie, metoda find(): Friend.find(function (err, przyjaciele) { if (err) return console.error(err); for(var i=0; i<przyjaciele.length; i++) { console.log('%s', przyjaciele[i].nazwa); } }) Wyszukiwanie można prowadzić, np. po nazwie: find({ nazwa: /ˆJol/ } Friend.find({ nazwa: /^Jol/ }, function (err, przyjaciele) { if (err) return console.error(err); console.log("====================\n"); for(var i=0; i<przyjaciele.length; i++) { console.log('%s', przyjaciele[i].nazwa); } }); // lista przyjaciół nazywających sie Jol*
MongoDB. Narzędzia i biblioteki 65/99 mongoose - schematy Jak tego używać? server.js mongoose - http://mongoosejs.com/index.html var mongoose = require('mongoose'); var TodoSchema = new mongoose.schema({ name: String, completed: Boolean, note: String, updated_at: { type: Date, default: Date.now }, }); var ListaTodo = mongoose.model('todo', TodoSchema); Typy danych w mongoose: String, Boolean, Date, Array, Number, ObjectId, Mixed, Buffer.
MongoDB. Narzędzia i biblioteki 66/99 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 i biblioteki 67/99 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 i biblioteki 68/99 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 i biblioteki 69/99 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 i biblioteki 70/99 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 i biblioteki 71/99 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 i biblioteki 72/99 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 i biblioteki 73/99 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 i biblioteki 74/99 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 i biblioteki 75/99 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 i biblioteki 76/99 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 i biblioteki 77/99 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 i biblioteki 78/99 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 i biblioteki 79/99 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 i biblioteki 80/99 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 i biblioteki 81/99 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 i biblioteki 82/99 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 baze 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 i biblioteki 83/99 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 i biblioteki 84/99 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 i biblioteki 85/99 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 i biblioteki 86/99 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 i biblioteki 87/99 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 i biblioteki 88/99 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 i biblioteki 89/99 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 i biblioteki 90/99 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 i biblioteki 91/99 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 i biblioteki 92/99 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 i biblioteki 93/99 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 i biblioteki 94/99 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 i biblioteki 95/99 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 i biblioteki 96/99 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 i biblioteki 97/99 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 i biblioteki 98/99 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 i biblioteki 99/99 Ź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