ugrás a tartalomhoz

mongoDB join...

mind1 valami név · Már. 23. (K), 14.42
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?
 
2

Bocs, tárgytalan...

mind1 valami név · Már. 25. (Cs), 06.19
Kicsit elkapkodtam a dolgot: a tesztadatok betöltésekor mindig lefut egy db.collection.drop(), ami viszi az indexet is.
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)
1

Join eltérő típusú mezők közt?

mind1 valami név · Már. 23. (K), 15.52
Közben eszembe jutott egy másik dolog, amibe már korábban belefutottam: amikor a disqus fórum adataival játszottam, feltűnt valami fura: az egyes kommentek id-je string típusú, a thread id is, de a kommentben van egy parent mező, ami azt jelzi, hogy melyik kommentre írták a választ. A gond, hogy ez numerikus, így a $lookup nem talált egyezést.
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?
3

azt hiszem, megvan

mind1 valami név · Már. 25. (Cs), 06.20
https://stackoverflow.com/questions/44344711/how-to-convert-objectid-to-string-in-lookup-aggregation

Ez az $addFields valami meglepő dolog volt. Úgy tűnik, valamit kihagytam a tutorialban, reference guide-ban...
És nem remote, hanem foreignField...
4

Hát ez durva volt :)

mind1 valami név · Már. 26. (P), 22.33
Két teszt "tábla" (collection), az egyikben 100ezer körüli dokumentum, a másikban párszáz, a kettő összekapcsolva a lekérdezéskor.
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)