Hosting MongoDB odniósł ogromny sukces w społeczności programistów, częściowo dlatego, że umożliwia programistom przechowywanie struktur danych bezpośrednio w szybkiej, skalowalnej, nowoczesnej bazie danych .
Nie ma potrzeby mapowania tych struktur danych na sztywne, predefiniowane i płaskie tabele, które trzeba ponownie złożyć w czasie wykonywania za pomocą wielu tabel pośrednich. (Opisany w ten sposób model relacyjny brzmi trochę staroświecko, prawda?)
Niestety, światowe oprogramowanie analityczne i raportujące nie może zrozumieć danych postrelacyjnych. Jeśli nie jest płaski, jeśli nie jest jednolity, nie możesz nic z nim zrobić w starszych rozwiązaniach analitycznych i raportowych!
To prawdziwy problem, ponieważ programiści tworzą aplikacje MongoDB, które generują mnóstwo danych. Ostatecznie firmy chcą dzielić te dane na kawałki, tworzyć raporty i zbierać informacje.
Możesz to wszystko zrobić dzisiaj, ale musisz pisać całe kawałki kodu, przekształcać i replikować dane MongoDB do innej bazy danych lub hurtowni danych lub w inny sposób przechodzić przez intensywny, długotrwały ból i cierpienie, jakiego lubię unikać.
Właśnie dlatego założyłem SlamData. SlamData to firma typu open source rozwijająca narzędzie do analizy i raportowania nowej generacji dla danych NoSQL.
Właśnie uruchomiliśmy wersję beta SlamData, która obsługuje MongoDB. W tym poście opowiem o tym, jak możesz użyć tej wersji beta do wysyłania zapytań do MongoDB przy użyciu zwykłego SQL, jakie są niektóre ograniczenia, jak SlamData wypada w porównaniu z konkurencją i dokąd zmierza projekt.
Pobieranie i instalacja SlamData
Możesz zbudować SlamData z kodu źródłowego na Github. Ale jeśli nie lubisz grzebać w kodzie źródłowym, polecam pobrać instalatory GUI ze strony internetowej SlamData.
Istnieją gotowe instalatory dla systemów Linux, OS X i Windows, które są dostarczane w pakiecie ze wszystkim, czego potrzebujesz (z wyjątkiem działającej instancji MongoDB!).
Podczas procesu instalacji kreator poprosi Cię o identyfikator URI połączenia MongoDB (który może zawierać nazwę użytkownika i hasło), konkretną bazę danych, której chcesz użyć (nie martw się, możesz dodać więcej później) i gdzie w SlamData system plików, w którym chcesz zamontować tę bazę danych (którą możesz pozostawić jako „/”, ścieżka główna).
Po instalacji możesz uruchomić SlamData za pomocą dwukrotnego kliknięcia. Zwróć uwagę, że w rzeczywistości SlamData składa się z dwóch komponentów:interfejsu i lekkiego serwera, który łączy się z MongoDB. Domyślnie oba zostaną zainstalowane i oba zostaną uruchomione po dwukrotnym kliknięciu SlamData.
Interfejs SlamData
Front-end SlamData, pokazany na powyższym zrzucie ekranu, jest wizualnym interfejsem dla całej mocy SlamData (jest też REPL dla tych, którzy wolą interfejs wiersza poleceń).
Drzewo systemu plików pokazuje wszystkie zamontowane bazy danych, a także kolekcje wewnątrz tych baz danych. Jest to wizualne przypomnienie wszystkich danych, które możesz przeszukać, chociaż w późniejszych wersjach będziesz mógł zrobić o wiele więcej z systemem plików.
Interfejs edytora umożliwia tworzenie notatników, które są zbiorami tekstu (Markdown), zapytań (SQL) i wizualizacji (wykresów). Notatnik jest jak raport, z wyjątkiem tego, że w przeciwieństwie do większości raportów może być interaktywny i może być odświeżany na podstawie danych na żywo.
Pisanie zapytań
Czas napisać kilka zapytań!
W tych przykładach zakładam, że masz zestaw danych kodu pocztowego załadowany do bazy danych MongoDB, którą możesz pobrać ze strony MongoDB.
Ten zestaw danych zawiera podstawowe informacje o kodach pocztowych, takie jak ich lokalizacja (miasto, stan, obszar geograficzny) i ich populacja.
Cofnijmy pierwsze 5 wpisów zip:
WYBIERZ * Z suwaków LIMIT 5
{ “_id” :“35004″ , “miasto” :“ACMAR” , “loc” :[ -86.51557 , 33.584132] , “pop” :6055 , “stan” :“AL”}
{ “_id” :“35005″ , “miasto” :“ADAMSVILLE” , “loc” :[ -86.959727 , 33.588437] , “pop” :10616 , “stan” :“AL”}
{ “_id” :“35006″ , “miasto” :“ADGER” , “loc” :[ -87.167455 , 33.434277] , “pop” :3205 , “stan” :“AL”}
{ “_id” :“35007″ , “miasto” :“KEYSTONE” , “loc” :[ -86.812861 , 33.236868] , “pop” :14218 , “stan” :“AL”}
{ “_id” :“35010″ , “city” :“NOWA STRONA” , “loc” :[ -85.951086 , 32.941445] , “pop” :19942 , “state” :“AL”}
Jakie miasta mają 5 najbardziej zaludnionych kodów pocztowych? Bułka z masłem:
WYBIERZ miasto, pop FROM zips ORDER BY pop DESC LIMIT 5
{ “_id” :“60623″ , “miasto” :“CHICAGO” , “pop” :112047}
{ “_id” :“11226″ , “miasto” :“BROOKLYN” , “pop” :111396}
{ “_id” :“10021″ , “miasto” :“NOWY JORK” , “pop” :106564}
{ “_id” :“10025″ , “miasto” :“NOWY JORK” , “pop” :100027}
{ “_id” :“90201″ , “miasto” :“DZWONKI” , “pop” :99568}
Dialekt SQL SlamData (zwany SlamSQL) ma pełną obsługę zagnieżdżonych dokumentów i tablic, a dostęp do nich uzyskuje się za pomocą zwykłej notacji JavaScript (np. SELECT foo.bar.baz).
Czasami będziesz chciał spłaszczyć tablicę, aby móc zagłębić się w zawartość tej tablicy. W zbiorze danych ZIP znajduje się pole tablicy loc zawierające geolokalizację. Aby spłaszczyć tę tablicę, po prostu użyj operatora gwiazdki („*”) jako indeksu tablicy:
SELECT loc[*] FROM zips LIMIT 1
{ “_id” :{ “$oid” :“53ecf39574d2394acbd4b6f1″} , “loc” :-86.51557}
Na koniec użyjmy operatora GROUP BY SQL, aby zsumować populację wszystkich kodów pocztowych dla każdego miasta, a następnie wyodrębnijmy 5 najbardziej zaludnionych miast:
WYBIERZ miasto, SUM(pop) JAKO pop FROM zips GROUP WEDŁUG miasta ZAMÓW WG pop DESC LIMIT 5
Całkiem fajnie, co?
Większość funkcji MongoDB jest obecnie obsługiwana w wersji beta, chociaż mają one swoje standardowe nazwy SQL (lub, w zależności od przypadku, nazwy PostgreSQL). Należą do nich:
- KOKATOWA, DOLNA, GÓRNA, PODŁAŃCUCH
- DATE_PART
- LICZBA, SUMA, MIN, MAKS, ŚREDNIA
- +, -, *, /, %
- ARRAY_LENGTH
Ograniczenia wersji beta
Wersja beta jest nazywana „beta” nie bez powodu:nie implementuje całego SlamSQL i może zawierać kilka błędów w częściach SlamSQL, które implementuje.
W szczególności należy zwrócić uwagę na następujące ograniczenia:
- Chociaż obsługiwana jest funkcja GRUPA WEDŁUG, klauzule POSIADAJĄCE nie zostały jeszcze zaimplementowane.
- Wszystkie funkcje nieobsługiwane natywnie przez potok agregacji (np. długość ciągu znaków) nie są jeszcze obsługiwane.
- Wybieranie pojedynczych elementów tablicy nie jest jeszcze obsługiwane (np. SELECT loc[0] FROM zips) z powodu znanego problemu w MongoDB.
- DISTINCT i inne operacje na poziomie zestawu, takie jak UNION, UNION ALL, nie są jeszcze obsługiwane.
- Dołączenia nie są jeszcze obsługiwane w oficjalnie wydanej wersji (chociaż mamy gałąź na Github, która je obsługuje, dla tych, którzy lubią krwawić krawędź!).
- Istnieją różne przypadki brzegowe, które nie zostały jeszcze zaimplementowane.
Jak się układa SlamData
Obecnie na rynku nie ma zbyt wielu narzędzi do wykonywania analiz w MongoDB.
W świecie open source:
- Istnieją sterowniki MongoDB (dostępne w Pythonie, Javie itp.), ale te biblioteki są przeznaczone dla programistów, a nie analityków czy naukowców zajmujących się danymi. trzeba napisać kod, aby z nich korzystać.
- PostgreSQL ma opakowanie danych zagranicznych typu open source dla MongoDB dostarczone przez CitrusData. W tej chwili może przesyłać tylko proste filtry do MongoDB. Wszystkie inne operacje wymagają przesyłania strumieniowego danych z powrotem z MongoDB do PostgreSQL.
- MoSQL to narzędzie typu open source, które upraszcza ETL z MongoDB do PostgreSQL. Musisz sztywno zdefiniować schematy, spłaszczyć dane i unikać tablic, a także utrzymywać oddzielną infrastrukturę do analiz i raportowania.
W sektorze komercyjnym:
- Studio danych AquaFold ma klienta MongoDB. Nie jest jasne, co dokładnie spycha do sterownika, chociaż wydaje się, że są to pewne wyrażenia, filtry, a może grupowanie. Jednak w przypadku niektórych operacji dane muszą być przesyłane strumieniowo z powrotem do klienta, co czyni je niepraktycznymi dla wielu aplikacji.
- JSONStudio ma interfejs, który umożliwia „wizualne” budowanie zapytań potoku dla struktury agregacji MongoDB, ale podlega tym samym ograniczeniom co agregacja framework i nie korzysta ze standaryzacji i deklaratywności SQL.
- Simba Technologies ma sterownik MongoDB ODBC. Może przesłać niektóre filtry i agregacje do MongoDB, ale wszystko inne musi zostać przesłane z powrotem do sterownika w celu dalszego przetwarzania.
- Progress Software ma rodzinę produktów do łączności danych o nazwie DataDirect ze złączem MongoDB. Nie jest jasne, ile te sterowniki przekazują do MongoDB, ale prawdopodobnie są bardzo podobne do sterownika z Simby i wymagają tworzenia schematów.
- UnityJDBC ma sterownik JDBC dla MongoDB, ale większość pracy wykonuje strumieniowo (z wyjątkiem surowego i bardzo prostego filtrowania).
SlamData bardzo dobrze wypada zarówno w porównaniu z ofertami open source, jak i komercyjnymi:
- SlamData jest w 100% open source, nie ma nic do kupienia ani licencji.
- SlamData przesyła 100% każdego zapytania do MongoDB bez przesyłania strumieniowego z powrotem do klienta. Zawsze.
- SlamData nie wymaga definicji schematu, mapowania schematu ani żadnego ETL. Działa tylko z danymi, ponieważ już istnieje w MongoDB.
- SlamData nadaje zagnieżdżonym dokumentom i tablicom status pierwszej klasy. Łatwo jest zagłębić się w dowolną strukturę za pomocą czystego, prostego i oczywistego rozszerzenia SQL (np. foo.bar.baz[2].fuz).
- SlamData ma odlotowy, ale lekki interfejs, który umożliwia tworzenie interaktywnych raportów wraz z wykresami. Łatwo jest przekazać front-end „tej osobie” w zespole lub organizacji, dzięki czemu możesz robić to, za co płacisz, zamiast pisać kod do generowania raportów.
Mapa drogowa
Na początku października planujemy wydać wersję produkcyjną SlamData.
W tym wydaniu zajmiemy się wieloma ograniczeniami wersji beta, poprawimy sposób kompilowania SQL do MongoDB i sprawimy, że interfejs użytkownika będzie znacznie łatwiejszy w użyciu i bardziej wydajny.
Jako projekt open source, nasz sukces sprowadza się do adopcji. Jeśli chcesz zobaczyć, jak SlamData nadal ewoluuje w najlepsze narzędzie typu open source do analizy i raportowania NoSQL, pobierz SlamData, rozwidlej lub oznacz gwiazdką repozytoria i skomentuj wszelkie znalezione błędy lub funkcje, które chcesz dodać.