ugrás a tartalomhoz

mongodb sorrendezés - ékezet

gtoma · 2013. Jan. 22. (K), 20.44
Kedves fórumozók!

Most ismerkedem a mongodb -vel, és egész gyorsan feltűnt, hogy nincs megoldva benne a a megfelelő sorrendezés. Az ékezetes betűket, a kisbetűket nem a megfelelő helyre rakja. Gondolom ismerős.

A kérdésem az lenne, hogy tudtok erre megoldást (én sajnos nem találtam), nem szeretném php-vel a 10.000 terméket sorrendezni, szimpi lenne, ha megcsinálná a mango :)

előre is köszönöm az ötleteket.
 
1

Szervusz, Az utánam szólók

bbaga · 2013. Jan. 23. (Sze), 12.15
Szervusz,

Az utánam szólók majd kijavítanak ha tévedek, de a doksijából kiindulva, most ennyit tud a mongo. A kis/nagybetű problémára vannak olyan "megoldások", hogy egy plusz mezőben - amire rendezel - legyártod a full kisbetűs verzióját mindennek, illetve az aggregation framework-kel $toLower-t használva megspórolhatod a plusz mezőt, kérdés, hogy mennyire lesz lassú a cucc.

Az ékezetes betűkre is gondolom hasonló megoldást ajánlanának, én még nem találkoztam olyan funkcióval - mongo af-en belül - ami kitakarítja az ékezetes betűket a szövegekből, szóval itt elképzelhető, hogy erre tényleg plusz mező kell, és ha már idáig fajul a dolog, akkor gondolom érdemes egyből kisbetűre is alakítani a szövegeket.
2

Nem igazán értek a

Poetro · 2013. Jan. 23. (Sze), 13.10
Nem igazán értek a MongoDB-hez, de az nem JavaScript-et használ belül? Mármint nem lehetne JavaScript-ben megírni egy függvényt, ami az összehasonlítást végzi? És akkor lehetne használni a String.localeCompare függvényt az összehasonlításra.

db.eval(function() { 
  return db.scratch.find().toArray().sort(
    function(doc1, doc2) { 
      return doc1.name.localeCompare(doc2.name); 
    }
  ) 
});
Persze ennek nem lesz túl nagy a hatékonysága, valamint más korlátai is vannak a dokumentáció szerint.
3

Igen, sajnos

gabesz666 · 2013. Jan. 23. (Sze), 14.36
Igen, sajnos úgy tűnik, hogy ezt nem tudja a MongoDB. Egy kapcsolódó bejegyzés.
4

Hasonló

gtoma · 2013. Jan. 23. (Sze), 18.08
megoldásba gondolkodom én is, hogy a sorrendezendő mezőknek lesz egy másik mezője, amibe kisbetűsen tárolom az adatokat lecserélve a betűket pl Ádám -> a{da{m , vagy valami hasonló.

De azért ez csúnyán favágó módszer. Sok olyan oszlop van, amit ékezetes, és sorrendezni kell.

Reméltem, hogy esetleg valaki észrevett / talált valamit már, amit én nem. :(
5

Miért kéne a kapcsos zárójel?

MadBence · 2013. Jan. 23. (Sze), 19.59
Miért kéne a kapcsos zárójel? A magyar helyesírás szabályai szerint az ékezetes és az ékezet nélküli magánhangzók egyenértékűek (azt hiszem az u-ü kivétel).
6

A fentiek egyáltalán nem

Joó Ádám · 2013. Jan. 23. (Sze), 20.22
A fentiek egyáltalán nem igazak (lásd MHSZ 14.): a szabályzat szerint az azonos magánhangzók rövid és hosszú párjait (a-á, e-é, i-í, o-ó, ö-ő, u-ú, ü-ű) nem különböztetjük meg a sorrendben, ez azonban nem azt jelenti, hogy elhagyjuk az ékezetet és aszerint soroljuk be.

A személyes véleményem azonban az, hogy az a-á és e-é párokban a megkülönböztetés hiánya hiba, ugyanis a félrevezető ékezethasználat ellenére a két pár négy különböző fonémát jelöl, az a-á és e-é ugyanolyan viszonyban állnak, mint az o-ö és u-ü. A magam részéről tehát ezeket megkülönböztetném a sorba rendezéskor, mert így intuitív.
8

Szerintem én is ugyanezt

MadBence · 2013. Jan. 23. (Sze), 23.04
Szerintem én is ugyanezt írtam (rendben, az o-ö párost kifelejtettem). Kifejtenéd, miben tér el a helyes algoritmus attól, hogy az ember az ékezetes magánhangzókból ékezet nélkülit csinál, és aszerint rendezi sorba? (kivétel az ü és ö)
9

Bocs, erősen fogalmaztam,

Joó Ádám · 2013. Jan. 24. (Cs), 01.34
Bocs, erősen fogalmaztam, mert amikor elkezdtem írni a hozzászólást, még nem jutott eszembe, hogy az a-á és e-é párokat a szabályzat együtt kezeli, ezért csak az u-ü-t kiemelni nagyon furcsa állítás volt. Utólag már látszik, hogy csak kifelejtetted, de nem olvastam újra az elejét a kommentemnek.

Maga az algoritmus persze bonyolultabb, ahogy lejjebb írtam.
7

A legjobb, amit tehetsz az

Joó Ádám · 2013. Jan. 23. (Sze), 20.52
A legjobb, amit tehetsz az egy új mező felvétele, amiben kódolva tárolod az ujjlenyomatát a szónak. Azt javaslom, hogy ez a mező legyen bináris, amihez használj egy saját hozzárendelést minden magyar betű esetére.

Vigyázz, ha valóban a magyar helyesírás szabályai alapján szeretnéd betűrendbe sorolni a szavakat, akkor szükséged lesz egy szótárra, hogy meg tudd különböztetni az egymás mellé kerülő egyjegyű és a magukban álló többjegyű (és az egymás mellé kerülő egyjegyű és többjegyű) betűket egymástól!

Ha ez alapján eldöntötted, hogy pontosan milyen betűket tartalmaz a szó, akkor a többjegyű mássalhangzók hosszú alakját ki kell bontsd (ho[ssz]ú → ho[sz][sz]ú). Miután elvégezted a betűnkénti megfeleltetést, ha több szavas kifejezéseket is tárolsz, azokból töröld a szóközöket, mert azok nem számítanak a besoroláskor.

A magyar ábécé 40 betűt tartalmaz a kis- és a nagybetűket nem megkülönböztetve, ha szükséges, ezt a sorba rendezéskor kiegészítheted az idegen q, x, y és w betűkkel. Ha a szabályok szerint jársz el, akkor összesen ennyi különböző kódra lesz szükséged, és nem tudsz csak egyszerű bináris összehasonlítást végezni a megjelenítéskor, mert habár a rövid-hosszú párok önmagukban nem különböztetik meg a szavakat a rendezéskor, azonban ha csak magánhangzók hosszában tér el két szó, akkor a rövid magánhangzót tartalmazó előbbre kerül a sorban, így tehát a listázáskor meg kell vizsgáld az adatbázistól visszakapott eredményt, és azokban az esetekben, ahol kell, felcseréld a csak a hosszokban eltérő szavakat.

Ha úgy döntesz, hogy eltérsz a szabályzattól, és az egyébként intuitív megközelítésd választod, akkor megkülönböztetheted az összes magánhangzót egymástól, és egy egyszerű bináris rendezéssel megkapod az adatbázistól a kész adatokat.
10

Köszönöm

gtoma · 2013. Jan. 24. (Cs), 12.45
az 5leteket.

Igazából nem sikerült véglegesen meggyőznöm magamat arról, hogy helyes-e befoltozni a hibát. Rágódom még, hogy mongodb, vagy inkább mysql mondjuk egy RedBeanPHP vel. (egyébként egy "normál" webáruházas, cms-es weboldal programozásáról van szó).
11

felesleges

Greg · 2013. Jan. 24. (Cs), 13.03
Akkor neked a mongodb felesleges. Ez inkabb akkor hasznos, ha nagyon sok adatot kell kezelni.