Ó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
        }
    }
]);