Bazy dokumentów. MongoDB - Instytut Informatyki Teoretycznej i

Transkrypt

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

Podobne dokumenty