Po pierwsze, witamy w MongoDB!
Należy pamiętać, że MongoDB stosuje podejście „NoSQL” do przechowywania danych, więc zapomnij o myślach o wyborze, złączeniach itp. Sposób, w jaki przechowuje Twoje dane, ma postać dokumentów i zbiorów, co pozwala na dynamiczne dodawanie i pozyskiwanie danych z Twoich lokalizacji przechowywania.
Biorąc to pod uwagę, aby zrozumieć koncepcję parametru $ relax, musisz najpierw zrozumieć, co mówi przypadek użycia, który próbujesz zacytować. Przykładowy dokument z mongodb.org wygląda następująco:
{
title : "this is my title" ,
author : "bob" ,
posted : new Date () ,
pageViews : 5 ,
tags : [ "fun" , "good" , "fun" ] ,
comments : [
{ author :"joe" , text : "this is cool" } ,
{ author :"sam" , text : "this is bad" }
],
other : { foo : 5 }
}
Zwróć uwagę, że tagi są w rzeczywistości tablicą trzech elementów, w tym przypadku „zabawnych”, „dobrych” i „zabawnych”.
To, co robi $ relax, to pozwala ci zdjąć dokument dla każdego elementu i zwrócić ten wynikowy dokument. Myślenie o tym w klasycznym podejściu byłoby równoznaczne z wyrażeniem „dla każdego elementu tablicy tagów zwróć dokument zawierający tylko ten element”.
W ten sposób wynik uruchomienia:
db.article.aggregate(
{ $project : {
author : 1 ,
title : 1 ,
tags : 1
}},
{ $unwind : "$tags" }
);
zwróci następujące dokumenty:
{
"result" : [
{
"_id" : ObjectId("4e6e4ef557b77501a49233f6"),
"title" : "this is my title",
"author" : "bob",
"tags" : "fun"
},
{
"_id" : ObjectId("4e6e4ef557b77501a49233f6"),
"title" : "this is my title",
"author" : "bob",
"tags" : "good"
},
{
"_id" : ObjectId("4e6e4ef557b77501a49233f6"),
"title" : "this is my title",
"author" : "bob",
"tags" : "fun"
}
],
"OK" : 1
}
Zauważ, że jedyną zmianą w tablicy wyników jest to, co jest zwracane w wartości tagów. Jeśli potrzebujesz dodatkowych informacji na temat tego, jak to działa, zamieściłem tutaj link . Mam nadzieję, że to pomoże i powodzenia w wyprawie do jednego z najlepszych systemów NoSQL, z jakimi się do tej pory spotkałem.
Zgodnie z oficjalną dokumentacją Mongodb:
$ relax Dekonstruuje pole tablicowe z dokumentów wejściowych, aby wyprowadzić dokument dla każdego elementu. Każdy dokument wyjściowy jest dokumentem wejściowym, w którym wartość pola tablicy jest zastępowana przez element.
Wyjaśnienie poprzez podstawowy przykład:
Na inwentarz zbiorczy znajdują się następujące dokumenty:
Następujące operacje $ rozwijania są równoważne i zwracają dokument dla każdego elementu w polu rozmiarów . Jeśli pole rozmiarów nie jest przekształcane w tablicę, ale nie brakuje, ma wartości null lub jest pusta, $ relax traktuje operand niebędący tablicą jako tablicę pojedynczego elementu.
lub
Powyższe dane wyjściowe zapytania:
Dlaczego jest to potrzebne?
$ relax jest bardzo przydatne podczas wykonywania agregacji. dzieli złożony / zagnieżdżony dokument na prosty dokument przed wykonaniem różnych operacji, takich jak sortowanie, wyszukiwanie itp.
Aby dowiedzieć się więcej o $ relax:
https://docs.mongodb.com/manual/reference/operator/aggregation/unwind/
Aby dowiedzieć się więcej o agregacji:
https://docs.mongodb.com/manual/reference/operator/aggregation-pipeline/
źródło
rozważ poniższy przykład, aby zrozumieć te dane w kolekcji
Zapytanie - db.test1.aggregate ([{$ odwijanie: "$ rozmiary"}]);
wynik
źródło
Pozwólcie, że wyjaśnię w sposób powiązany z RDBMS. Oto oświadczenie:
złożyć wniosek do dokumentu / zapisu :
$ Projekt / Select prostu zwraca te kolumny jak ostrości /
Następna jest fajna część Mongo, traktuj tę tablicę
tags : [ "fun" , "good" , "fun" ]
jako kolejną powiązaną tabelę (nie może być tabelą przeglądową / referencyjną, ponieważ wartości są zduplikowane) o nazwie „tagi”. Pamiętaj, że SELECT generalnie tworzy rzeczy pionowe, więc rozwinięcie "tagów" to podzielenie () pionowo na "tagi" tabeli.Końcowy wynik $ project + $ relax:
Przetłumacz wynik na JSON:
Ponieważ nie kazaliśmy Mongo pominąć pola „_id”, więc jest ono dodawane automatycznie.
źródło