mongoDB join...
Egy blogos példat nézegetve akadtam el: a kommenteknek van két azonosítója, a saját és egy "előző", ami null/none, ha új komment, a hivatkozott komment azonosítója, ha válasz egy korábbira.
Szeretném látni az eredeti komment bizonyos paramétereit a válasz mellett. Ez valami join jellegű dologgal oldható meg, idáig eljutottam a tutorialokban:
db.collection.aggregate(), ennek kell egy (bocs, ez inkább python szintaxis, azt hiszem)
[{"$lookup": { "from": "collection", "localField":"orig", "foreignField": "id", "as": "valami"}}]
Egyelőre egyáltalán nem működik, de ez valószínűleg valami elírás miatt lesz.
Tegnap egyszer működni látszott, de iszonyat lassú. Pedig az "id" indexet is kapott.
Lassú: 2-3000 soron kell végigfutni, kiválogatva belőle nagyjából harmincat. Ez így 15-20mp volt... (Benne van a pakliban, hogy az adatmennyiség kb tízszeres volt, mert benne maradhatott korábbi teszt szemete is, de még akkor is nagyon lassú szerintem, legalábbis egy sql joinhoz képest, hiszen 1:1 megfeleltetés van)
Nem jó az elképzelésem? Másképp kellene?
Vagy ez egyszerűen ilyen?
■ Szeretném látni az eredeti komment bizonyos paramétereit a válasz mellett. Ez valami join jellegű dologgal oldható meg, idáig eljutottam a tutorialokban:
db.collection.aggregate(), ennek kell egy (bocs, ez inkább python szintaxis, azt hiszem)
[{"$lookup": { "from": "collection", "localField":"orig", "foreignField": "id", "as": "valami"}}]
Egyelőre egyáltalán nem működik, de ez valószínűleg valami elírás miatt lesz.
Tegnap egyszer működni látszott, de iszonyat lassú. Pedig az "id" indexet is kapott.
Lassú: 2-3000 soron kell végigfutni, kiválogatva belőle nagyjából harmincat. Ez így 15-20mp volt... (Benne van a pakliban, hogy az adatmennyiség kb tízszeres volt, mert benne maradhatott korábbi teszt szemete is, de még akkor is nagyon lassú szerintem, legalábbis egy sql joinhoz képest, hiszen 1:1 megfeleltetés van)
Nem jó az elképzelésem? Másképp kellene?
Vagy ez egyszerűen ilyen?
Bocs, tárgytalan...
Manuálisan beírva a parancsokat mindig elkészítettem az indexet. Most programot írtam a kereséshez is, ott lemaradt a createIndex.
Pótoltam, így egy 50000 "dokumentumból" álló kollekción 1-2mp alatt végez, ez már elfogadható számomra. (egyelőre)
Join eltérő típusú mezők közt?
Most kipróbáltam egy ilyen felállást is, nem én rontottam el, valóban nem találja meg, ha az egyik numerikus, a másik string, viszont egy szót sem szól, hogy valami nem kerek.
Nagyobb gond, hogy a localField és a remoteField kötelezően string típus, olyat nem fogad el, hogy a "parent" helyére { "$tostring": "parent" } -t írok. Ha ilyen előfordulna a való életben (bár szerintem ez tervezési baki), akkor mit lehet csinálni vele?
azt hiszem, megvan
Ez az $addFields valami meglepő dolog volt. Úgy tűnik, valamit kihagytam a tutorialban, reference guide-ban...
És nem remote, hanem foreignField...
Hát ez durva volt :)
Limit nélkül, db.collection.aggregate([ sort..., ..., lookup... ]) segítségével futtattam volna végig egy lekérdezést és a laptomom úgy lefagyott, hogy csak fizikailag ki-/bekapcsolva tudtam tovább dolgozni vele.
Hm. Elfogyott a memória. O.K., de lefagy?
Úgy tűnik, igen: a mongodb szerver megfogta az összes processzormagot, felzabálta a memóriát.
Megoldás: a pici táblára indexet kellett kreálni (azt most hagyjuk, hogy miért nincsenek processz limitek beállítva, hogy ne tudjon így lefagyni a gép! :D)