Órai példa feladatok - 2017
Hasznos linkek
SQL to NoSQL mapping chart: https://gist.github.com/aponxi/4380516
1. feladat - $lookup
A feladat 2 collection-ben lévő dokumentumok összefűzése.
A stewardessek collection egy példa dokumentuma:
{
"_id" : ObjectId("5907b60a8a6d6094bdfd4404")
, "nev" : "Juhász Netta"
, "repulesek_szama" : 20
, "fizetes" : 348887
}
A jaratok collection egy példa dokumentuma:
{
"_id" : ObjectId("5907be488a6d6094bdfd4506")
, "repter" : {
"indul" : "Budapest"
, "erkezik" : "Tokió"
}
, "indulas_datuma" : "2016-11-20"
, "menetido" : 510
, "stewardessek" : [
ObjectId("5907b60a8a6d6094bdfd4404")
, ObjectId("5907b60a8a6d6094bdfd4445")
, ObjectId("5907b60a8a6d6094bdfd4486")
, ObjectId("5907b60a8a6d6094bdfd44c7")
]
}
A kimeneti dokumentumok elvárt szerkezete:
[
{
"_id" : ObjectId("5907be488a6d6094bdfd4506")
, "repter" : {
"indul" : "Budapest"
, "erkezik" : "Tokió"
}
, "indulas_datuma" : "2016-11-20"
, "menetido" : 510
, "stewardessek" : {
"_id" : ObjectId("5907b60a8a6d6094bdfd4404"),
, "nev" : "Juhász Netta",
, "repulesek_szama" : 20,
, "fizetes" : 348887
, }
}
, {
"_id" : ObjectId("5907be488a6d6094bdfd450a")
, "repter" : {
"indul" : "Budapest"
, "erkezik" : "Bécs"
}
, "indulas_datuma" : "2016-11-29"
, "menetido" : 271
, "stewardessek" : {
"_id" : ObjectId("5907b60a8a6d6094bdfd4445"),
, "nev" : "Boros Anikó",
, "repulesek_szama" : 11,
, "fizetes" : 392532
, }
}
// ...
]
A megoldás:
db.jaratok.aggregate([
{
"$lookup" : {
"localField" : "stewardessek"
, "from" : "stewardessek"
, "foreignField" : "_id"
, "as" : "stewardessek"
}
}
, {
"$unwind" : "$stewardessek"
}
]);
2. feladat - $lookup
A feladat 3 collection-ben lévő dokumentumok összefűzése. Az adatbázis rendelkezik egy kapcsoló collection-nel is, amely az idegen kulcsokat tartalmazza a másik két collection számára.
A pilotak collection egy példa dokumentuma:
{
"_id" : ObjectId("590759ee8a6d6094bdfd439a")
, "nev" : "Kiss József"
, "kor" : 34
}
A repulok collection egy példa dokumentuma:
{
"_id" : ObjectId("59078d688a6d6094bdfd43a9")
, "nev" : "VC-25A"
, "utasok_szama" : 23
}
A pilotak__repulok collection egy példa dokumentuma:
{
"_id" : ObjectId("590790348a6d6094bdfd43c8")
, "_id__pilotak" : ObjectId("590759ee8a6d6094bdfd439a")
, "_id__repulok" : ObjectId("59078d688a6d6094bdfd43a9")
}
A kimeneti dokumentumok elvárt szerkezete:
[
{
"pilota" : {
"nev" : "Kiss József"
, "kor" : 34
},
, "repulo" : {
"nev" : "VC-25A"
, "utasok_szama" : 23
}
}
, {
"pilota" : {
"nev" : "Istvánovics János"
, "kor" : 31
, }
"repulo" : {
"nev" : "Lockheed L–188 Electra"
, "utasok_szama" : 85
}
}
// ...
]
A megoldás:
db.pilotak__repulok.aggregate([
{
"$lookup" : {
"localField" : "_id__pilotak"
, "from" : "pilotak"
, "foreignField" : "_id"
, "as" : "pilota"
}
}
, {
"$unwind" : "$pilota"
}
, {
"$lookup" : {
"localField" : "_id__repulok"
, "from" : "repulok"
, "foreignField" : "_id"
, "as" : "repulo"
}
}
, {
"$unwind" : "$repulo"
}
, {
"$project" : {
"_id" : 0
, "_id__pilotak" : 0
, "_id__repulok" : 0
, "pilota._id" : 0
, "repulo._id" : 0
}
}
]);