TÁMOP C-11/1/KONV
|
|
- Ferenc Gáspár
- 6 évvel ezelőtt
- Látták:
Átírás
1 TÁMOP C-11/1/KONV
2 MongoDB A MongoDB egy nem-relációs, dokumentum-orientált adatbázis-kezelő rendszer, mely a NoSQL családba tartozik. Az első változat 2009-ben jött ki, vagyis relatíve új. Legfontosabb eltérések a tradicionális relációs adatbázis-kezelőkkel szemben: 1. nem támogatja a join műveletet 2. nincsenek tranzakciók 3. a sémák flexibilisek, vagyis egy kollekcióban nem kell minden dokumentumnak egyazon séma szerint felépülnie Nincs join, de vannak alternatívák, pl.: beágyazás. A join-t természetesen az alkalmazáskódban is meg lehet valósítani több lekérdezés használatával. 2
3 MongoDB Új mezőket (jellemzők, properties) bármikor, dinamikusan hozzá lehet adni egy rekordhoz, nincs szükség ALTER TABLE utasításokra. Ha ismerjük a JSON szerializációs formátumot, akkor azonnal ismerősnek fognak tűnni a MongoDB dokumentumai és lekérdezései. A gyorsabb lekérdezés végett itt is ki lehet alakítani indexeket bizonyos mezőkre. SQL adatbázis adatbázis tábla sor / rekord oszlop MongoDB adatbázis kollekció dokumentum mező / jellemző (property) MongoDB terminológia 3
4 JSON A JSON sok esetben használható az XML alternatívájaként szintén szöveg-alapú, az ember számára is jól olvasható szintén hierarchikus felépítésű szintén nagyszerűen használható alkalmazások közti kommunikációra egyszerűbb mint az XML nem annyira bőbeszédű, rövidebb gyorsabban lehet írni/olvasni 4
5 XML: <Person> <FirstName>Homer</FirstName> <LastName>Simpson</LastName> <Relatives> <Relative>Grandpa</Relative> <Relative>Marge</Relative> <Relative>The Boy</Relative> <Relative>Lisa</Relative> </Relatives> </Person> JSON: { } "firstname": "Homer", "lastname": "Simpson", "relatives": [ "Grandpa", "Marge", "The Boy", "Lisa" ] 5
6 XML: JSON: <persons> <person> <name>ford Prefect</name> <gender>male</gender> </person> <person> <name>arthur Dent</name> <gender>male</gender> </person> <person> <name>tricia McMillan</name> <gender>female</gender> </person> </persons> [ ] { "name": "Ford Prefect", "gender": "male" }, { "name": "Arthur Dent", "gender": "male" }, { "name": "Tricia McMillan", "gender": "female" } 6
7 XML: <settings> <path>/home/luke/dropbox/public</path> <user_id>123456</user_id> <auto_sync>true</auto_sync> </settings> JSON: { } "path": "/home/luke/dropbox/public", "user_id": , "auto_sync": true 7
8 JSON szintaktikai szabályok az adatok kulcs/érték párok az adatok vesszővel vannak elválasztva a kapcsos zárójelek objektumot jelölnek a szögletes zárójelek tömböt jelölnek JSON értékek Egy JSON érték a következő lehet: szám (egész vagy lebegőpontos) sztring (idézőjelek között) boolean (true vagy false) tömb (szögletes zárójelek között) objektum (kapcsos zárójelek között) null 8
9 Telepítés Ubuntu alatt #1 A MongoDB telepítését Linux alatt nézzük meg, de van bináris telepítő Windows illetve Mac OS X rendszerekhez is. A 32 bites verzió esetén az adatok mérete max. 2 GB lehet. Ezen korlátozás miatt érdemesebb inkább a 64 bites verziót telepíteni. Ha Ubuntu alatt a legfrissebb verziót szeretnénk feltenni, akkor ne a hivatalos Ubuntu repository-ból telepítsük, hanem közvetlenül a fejlesztőktől: 9
10 Telepítés Ubuntu alatt #2 A telepítő el is indítja a szervert. Erről meg is győződhetünk: jabba@montreal:~$ sudo service mongod status [sudo] password for jabba: mongod start/running, process 6408 jabba@montreal:~$ sudo service mongod stop mongod stop/waiting jabba@montreal:~$ sudo service mongod start mongod start/running, process 6645 státusz lekérdezése szerver leállítása szerver indítása A szerver alapértelmezés szerint a es porton figyel. Ha nem fut a szerver és nem tudjuk elindítani, akkor elképzelhető, hogy egy nem szabályos leállás során nem törlődött a lock állomány. A lock állomány helye: /var/lib/mongodb/mongod.lock 10
11 Telepítés Manjaro alatt A MongoDB telepítését Ubuntu mellett nézzük meg egy másik (egyre népszerűbb) disztribúción, a Manjaro Linuxon is. Itt könnyebb dolgunk van, ui. a repository-k gyorsabban frissülnek, mint az Ubuntu esetében. A telepítést a következő paranccsal tudjuk megtenni: $ sudo pacman -S mongodb A MongoDB itt nem indul el automatikusan. Ezt a következőképpen tudjuk engedélyezni: $ systemctl enable mongodb.service $ systemctl start mongodb.service Újraindításkor mostantól automatikusan el fog indulni a MongoDB. 11
12 Telepítés után Telepítés után a következőképpen tudunk meggyőződni arról, hogy tudunk-e kapcsolódni a szerverhez: nem kaptunk hibát, $ mongo minden rendben MongoDB shell version: connecting to: test > Lényeges könyvtárak / állományok: A bináris adatbázisok alapértelmezett helye. /var/lib/mongodb /var/lib/mongodb/mongod.lock /etc/mongodb.conf lock állomány konfigurációs állomány 12
13 Telepítés után A MongoDB elég nagyvonalúan allokál tárterületet az adatbázisok számára. Ez éles környezetben rendben van, de egy fejlesztői gépen valószínűleg szeretnénk spórolni a tárhellyel. Adjuk hozzá a következő sorokat a /etc/mongodb.conf végéhez: # disable data file preallocation noprealloc = true # use smaller files smallfiles = true Majd indítsuk újra a MongoDB szervert. Az új beállítások csak az újonnan létrehozott adatbázisokra fognak vonatkozni! 13
14 Webes adminisztráció A RockMongo egy PHP-ban írt webes adminisztrációs felület MongoDB adatbázisokhoz. Szerepét tekintve a PHPMyAdmin-hoz lehetne hasonlítani. Telepítés Ubuntu alatt Töltsük le a tömörített archívumot, majd bontsuk ki például a következő könyvtárba: /home/user/public_html/rockmongo/ Majd: sudo apt-get install php-pear sudo pecl install mongo 14
15 Webes adminisztráció Nyissuk meg a php.ini állományt (/etc/php5/apache2/php.ini) s adjuk a végéhez a következő sort: extension=mongo.so Majd indítsuk újra a webszervert. Végül látogassuk meg a webhelyet. Alapértelmezett felhasználói név / jelszó: admin / admin. Mindehhez természetesen az is kell, hogy a PHP szkriptek futtatása aktiválva legyen a HOME könyvtárunkban lévő public_html könyvtárban. 15
16 Webes adminisztráció Telepítés Manjaro alatt Először is tegyük fel az Apache webszervert, ill. a hozzá tartozó PHP támogatást: $ yaourt apache22 $ yaourt php-apache22 Majd indítsuk el a webszervert: $ systemctl enable httpd $ systemctl start httpd Ellenőrzésképpen látogassuk meg a címet. Ha minden jól ment, akkor hibaüzenet helyett egy üres könyvtárat kell kapnunk. 16
17 Webes adminisztráció Aktiváljuk a PHP támogatást. Nyissuk meg az /etc/httpd/conf/httpd.conf állományt, majd a végére illesszük be az alábbi sorokat: LoadModule php5_module modules/libphp5.so AddHandler php5-script php Include conf/extra/php5_module.conf Indítsuk újra a webszervert ( systemctl restart httpd ). A HOME könyvtárunkban hozzunk létre egy public_html nevű könyvtárat, majd ebben egy teszt PHP állományt index.php néven az alábbi tartalommal: <?php echo phpinfo();?> Nyissuk meg ezt a file-t az alábbi címen: Itt a PHP telepítésünkról szóló részletes listát kell kapnunk. 17
18 Webes adminisztráció Most már csak a PHP és a MongoDB közötti kommunikációt kell megteremteni. Ehhez telepítsük fel a php-mongo csomagot, majd indítsuk újra a webszervert. A címről töltsük le a RockMongo-t tömörített formában majd bontsuk ki a következő könyvtárba: /home/user/public_html/rockmongo/ Végül látogassuk meg a webhelyet. Alapértelmezett felhasználói név / jelszó: admin / admin. 18
19 A RockMongo webes felülete 19
20 CRUD műveletek mongo shellben CRUD alatt a következő alapvető műveleteket értjük: Create Read Update Delete MongoDB-beli megfelelőik Insert Find Update Remove Ezeket a műveleteket először a mongo shellben, majd pedig Python alkalmazásokban nézzük meg. $ mongo MongoDB shell version: connecting to: test > show collections > A mongo shellt a mongo parancs kiadásával tudjuk elindítani. Ez tulajdonképpen egy JavaScript interpreter. Alapértelmezés szerint a test nevű adatbázishoz csatlakozik. A show collections segítségével tudjuk lekérdezni egy adatbázis tábláit, vagyis kollekcióit. Jelenleg még nincs egyetlen kollekciónk sem. 26
21 $ mongo MongoDB shell version: connecting to: test > show collections > doc1 = {name: "John", age: 30, profession: "hacker"} { "name" : "John", "age" : 30, "profession" : "hacker" } > db.people.insert(doc1) WriteResult({ "ninserted" : 1 }) > doc2 = {name: "Jessie", age: 35, profession: "programmer"} { "name" : "Jessie", "age" : 35, "profession" : "programmer" } > db.people.insert(doc2) WriteResult({ "ninserted" : 1 }) > show collections people system.indexes > Létrehozunk egy doc1 nevű JSON objektumot. Egy kollekció JSON objektumok halmaza. A dokumentum 3 mezővel rendelkezik: név, életkor, foglalkozás. Ezt egy másik dokumentummal együtt beszúrjuk a people nevű kollekcióba. A db -vel az aktuális adatbázisra hivatkozunk, mely most a test nevű adatbázis. Beszúrás után a shell vissza is jelez, hogy sikeres volt a beszúrás. A show collections parancs hatására látható, hogy a people kollekció automatikusan létrejött. Vagyis ha egy nem létező kollekcióba szúrunk be, a MongoDB automatikusan létrehozza a kollekciót. Létrejött egy system.indexes kollekció is, mely az indexeket tárolja, de erről majd később lesz szó. 27
22 > db.people.find() { "_id" : ObjectId("54d1e6566b6fa7670efaeb20"), "name" : "John", "age" : 30, "profession" : "hacker" } { "_id" : ObjectId("54d1e69c6b6fa7670efaeb21"), "name" : "Jessie", "age" : 35, "profession" : "programmer" } > > db.people.findone() { "_id" : ObjectId("54d1e6566b6fa7670efaeb20"), "name" : "John", "age" : 30, "profession" : "hacker" } A find() függvény segítségével egy kollekció összes dokumentumát tudjuk lekérdezni. A findone() függvény csupán egyetlen dokumentumot ad vissza. Ezt inkább akkor használjuk, amikor a dokumentumok felépítésére vagyunk kíváncsiak (pl. milyen mezők vannak benne). Mint látható, minden dokumentum rendelkezik egy _id mezővel. Ez az elsődleges kulcs. Ha ezt beszúráskor nem adjuk meg, akkor a MongoDB automatikusan létrehoz a dokumentumban egy ilyen mezőt, melynek az értéke egy ObjectId objektum lesz, ami egy 96 bites hash érték. (A hash érték előállításakor figyelembe veszi az időt, a futtató gépet, processz ID-t, ill. egy globális számlálót a processzen belül. Ezek miatt az ütközés veszélye nagyon kicsi.) 28
23 > db.people.find({name: "John"}) Az SQL WHERE részének felel meg. Vagyis: keressük azokat a dokumentumokat, ahol a name mező értéke John. > db.people.find({name: "John"}, {name: true}) Az SQL SELECT részének felel meg. Vagyis: az eredmény rekordoknak csak a name mezőjét akarjuk látni. 29
24 > db.people.find({name: "John"}, {name: true}) { "_id" : ObjectId("54d1e6566b6fa7670efaeb20"), "name" : "John" } > db.people.find({name: "John"}, {name: true, _id: false}) { "name" : "John" } > db.people.find({}, {name: true, _id: false}) { "name" : "John" } { "name" : "Jessie" } > db.people.find({}, {name: 1, _id: 0}) { "name" : "John" } { "name" : "Jessie" } > Az első példában beállítottuk, hogy csak a name mezőt akarjuk megtartani az eredményben. Ennek ellenére a Mongo megjelenítette az _id -t is. Ez az alapértelmezett működési mód, így ha az _id -re nem vagyunk kíváncsiak, akkor ezt explicit módon el kell rejtenünk (lásd 2. példa). Ha a WHERE részben egy üres keresési feltételt adunk meg, akkor ez definíció szerint minden dokumentumra illeszkedni fog. Vagyis a 3. példát a következőképpen tudnánk megfogalmazni: listázd ki az összes dokumentumot, de csak a name mezőt jelenítsd meg! A 4. példában azt látjuk, hogy a true és false értékek helyett az 1 / 0 konstansok is használhatók. 30
25 Hasonlító operátorok $gt > $gte $lt < $lte > db.people.find({age: {$gt: 20}, profession: "hacker"}) Keressük azon dokumentumokat, ahol az age értéke nagyobb, mint 20 ÉS az illető foglalkozása hacker. Látható, hogy a WHERE részben több kifejezés is megadható egymástól vesszővel elválasztva, s ilyenkor a kifejezések logikai ÉS művelettel lesznek összekapcsolva. A fenti lekérdezés SQL megfelelője így nézne ki: SELECT * FROM people WHERE age > 20 AND profession = hacker 31
26 További operátorok $exists a dokumentum rendelkezik-e az adott mezővel > db.people.find({profession: {$exists: true}}) Azon dokumentumokra vagyunk kíváncsiak, amelyek rendelkeznek a profession mezővel. (Emlékezzünk, a MongoDB séma nélküli, vagyis egy kollekcióban nyugodtan lehetnek egymástól eltérő felépítésű dokumentumok). $regex mintaillesztés > db.people.find({name: {$regex: "^J"}}) Keressük azon személyeket, akiknek a neve J -vel kezdődik. 32
27 $regex mintaillesztés (folyt.) Egy reguláris kifejezést egyszerűbben is írhatunk: > db.people.find({name: /h/}) Azaz: keressük azon személyeket, akiknek a neve tartalmazza a h betűt. Mi a helyzet akkor, ha a minta tagadására van szükségünk? Pl. azon személyekre vagyunk kíváncsiak, akiknek a neve NEM tartalmazza a h betűt: > db.people.find({name: {$not: /h/}}) $or logikai VAGY, prefix operátor > db.people.find({$or: [{name: /e$/}, {age: {$exists: true}}]}) A $or prefix operátor, ezért előre kerül. Az egyes feltételeket egy listában ( [ és ] jelek között) fogjuk össze. Azon dokumentumokat akarjuk kiíratni, ahol az illető neve e -re végződik VAGY ha létezik a dokumentumban az age mező. 33
28 $and logikai ÉS, prefix operátor Legyen adott a köv. három dokumentum: > db.people.find() { "_id" :..., "name" : "John", "age" : 30, "profession" : "hacker" } { "_id" :..., "name" : "Jessie", "age" : 35, "profession" : "programmer" } { "_id" :..., "name" : "Andrea", "age" : 27, "profession" : "student" } Kérjük le azokat a személyeket, akiknek a neve lexikografikusan nagyobb, mint a C, ÉS a nevük tartalmazza az e betűt. A $and operátorra tulajdonképpen ritkán van szükség, ui. a fenti lekérdezést nélküle is meg lehet fogalmazni. Ehhez elegendő csupán több WHERE feltételt felsorolni: > db.people.find({name: {$gt: "C", $regex: "e"}}) { "_id" :..., "name" : "Jessie", "age" : 35, "profession" : "programmer" } Ugyanez a $and operátorral: > db.people.find({$and: [{name: {$gt: "C"}}, {name: {$regex: "e"}}]}) 34
29 $and logikai ÉS, prefix operátor (folyt.) VIGYÁZAT! Csábító lehet, hogy az előző lekérdezés esetében a két feltételt szétbontsuk: > db.people.find({name: {$gt: "C"}, name: {$regex: "e"}}) { "_id" :..., "name" : "Jessie", "age" : 35, "profession" : "programmer" } { "_id" :..., "name" : "Andrea", "age" : 27, "profession" : "student" } Mint látható, itt már két dokumentumot kaptunk eredményül, s az Andrea dokumentum esetében nem is teljesül, hogy lexikografikusan a C után következne. Ennek az az oka, hogy a névre vonatkozó második feltétel felüldefiniálta az első feltételt! A fenti lekérdezés így azokat a dokumentumokat adja vissza, ahol a név mező tartalmazza az e betűt. Az első feltétel felül lett írva. Ilyen esetekben válasszunk az előző oldalon látott megoldások közül. 35
30 Keresés listában Legyenek adottak a köv. dokumentumok: > db.students.find() { "_id" :..., "name" : "Andrew", "movies" : [ "Star Wars", "Indiana Jones" ] } { "_id" :..., "name" : "Brian", "movies" : [ "Star Trek", "Star Wars" ] } Próbáljuk ki az alábbi lekérdezést: > db.students.find({movies: "Star Wars"}) Ez mindkét rekordot vissza fogja adni! A lekérdezés kiértékelése a következőképpen történik: 1) Megnézi, hogy van-e ilyen nevű sztring típusú mező. 2) Ha nincs, akkor van-e ilyen nevű lista. Ebben a példában a válasz pozitív, hiszen a movies mező típusa lista. Ekkor megnézi, hogy a lista tartalmazza-e a keresett elemet. VIGYÁZAT! Csak a lista legfelső szintjét nézi végig! Ha a lista tartalmaz allistákat is, azokba nem megy bele rekurzívan! 36
31 $all contains all... Egy lista tartalmazza-e az általunk felsorolt összes elemet? (A sorrend nem számít) > db.students.find({movies: {$all: ["Star Wars", "Star Trek"]}}) { "_id" :..., "name" : "Brian", "movies" : [ "Star Trek", "Star Wars" ] } Keressük azokat, akiknek a kedvenc filmjei között szerepel mind a Star Wars, mind pedig a Star Trek. Látható, hogy a sorrend lényegtelen. $in contains either... or... Egy lista tartalmazza-e az általunk felsorolt elemek valamelyikét? > db.students.find({movies: {$in: ["Star Trek", "Terminator"]}}) { "_id" :..., "name" : "Brian", "movies" : [ "Star Trek", "Star Wars" ] } Keressük azokat, akiknek a kedvenc filmjei között szerepel a Star Trek vagy a Terminator. 37
32 Pontozott jelölés (dot notation) Tegyük fel, hogy a dokumentumaink a következőképpen épülnek fel: { } "_id" : ObjectId("54d6564f17c22d7c020604a9"), "product" : "Google Nexus 7", "price" : 145, "reviews" : [ { "user" : "alan", "score" : 4 }, { "user" : "anna", "score" : 5 } ] Keressük azokat a termékeket, amelyek 100 dollárnál drágábbak, s van 5-ös vagy jobb értékelésük: > db.products.find({price: {$gt: 100}, "reviews.score": {$gte: 5}}) A reviews mező lista típusú, de az elemei objektumok. Veszi a lista egyes elemeit, s megnézi, hogy az objektum score mezője 5. Ha igen, akkor teljesül a feltétel. 38
33 sort, skip, limit Legyenek adottak a következő dokumentumok: > db.names.find() { "_id" :..., "name" : "E" } { "_id" :..., "name" : "D" } { "_id" :..., "name" : "A" } { "_id" :..., "name" : "B" } { "_id" :..., "name" : "C" } Írassuk ki a neveket növekvő, ill. csökkenő sorrendben: > db.names.find().sort({name: 1}) # kimeneti sorrend: A, B, C, D, E > db.names.find().sort({name: -1}) # kimeneti sorrend: E, D, C, B, A Megadjuk, hogy melyik mező szerint szeretnénk rendezni a dokumentumokat, ill. rögzítjük a rendezés irányát (1: növekvő sorrend, -1: csökkenő sorrend). > db.names.find().sort({name: 1}).limit(2) # kimeneti sorrend: A, B Rendezzük az elemeket, de az eredményt csak az első két dokumentumra limitáljuk. 39
34 sort, skip, limit (folyt.) > db.names.find().sort({name: 1}).skip(2).limit(2) # kimenet: C, D Rendezzük az elemeket (A, B, C, D, E), ugorjuk át az első kettőt (marad: C, D, E), majd írassuk ki az első kettőt: C, D. A sort, skip és limit hívások felírási sorrendjétől függetlenül a rendszer ebben a sorrendben fogja őket végrehajtani: 1) sort, 2) skip, 3) limit. Vagyis egy db.names.find().limit(2).skip(2).sort({name: 1}) hívás kimenete is C, D lesz! count Állapítsuk meg egy kollekcióban lévő dokumentumok számát. Ezt kétféleképpen is megtehetjük: > db.names.find().count() 5 > db.names.count() 5 40
35 Update Dokumentumok módosítására szolgál. Példa: > db.people.find({name: "Andrea"}) { "_id" :..., "name" : "Andrea", "age" : 27, "profession" : "student" } > db.people.update({name: "Andrea"}, {name: "Sarah", age: 30}) WHERE rész melyik dokumentumot akarjuk módosítani új dokumentum a talált dokumentumot ezzel felülírjuk > db.people.find({name: "Sarah"}) { "_id" :..., "name" : "Sarah", "age" : 30 } VIGYÁZAT! Mint látható, a dokumentumból eltűnt a profession mező! Ennek az az oka, hogy az update esetében a talált dokumentumot egy új dokumentumra cseréltük le, amelyben csak a nevet és az életkort állítottuk be. Az _id mezőt ilyenkor változatlanul hagyja. 41
36 $set mező értékének beállítása / új mező hozzáadása > db.people.find({name: "Sarah"}) { "_id" :..., "name" : "Sarah", "age" : 30 } > db.people.update({name: "Sarah"}, {$set: {age: 33}}) > db.people.update({name: "Sarah"}, {$set: {profession: "protector"}}) > db.people.find({name: "Sarah"}) { "_id" :..., "name" : "Sarah", "age" : 33, "profession" : "protector" } Először beállítjuk az age mező értékét 33-ra. Mivel már volt ilyen mező, ezért csak frissül a mező értéke. Ezután beállítjuk a profession mező értékét. Mivel nem volt ilyen mező, ezért beszúrja ezt az új mezőt. Mint látható, itt már nem adjuk meg a teljes dokumentumot. $unset mező törlése > db.people.find({name: "Sarah"}) { "_id" :..., "name" : "Sarah", "age" : 33, "profession" : "protector" } > db.people.update({name: "Sarah"}, {$unset: {age: 1}}) > db.people.find({name: "Sarah"}) { "_id" :..., "name" : "Sarah", "profession" : "protector" } Az age mezőt eltávolítjuk a dokumentumból. Az age után itt 1-es értéket adtunk meg, de tetszőleges érték beírható, figyelmen kívül hagyja. 42
37 $inc mező értékének növelése / csökkentése > db.people.find({name: "Sarah"}) { "_id" :..., "name" : "Sarah", "profession" : "protector", "age" : 33 } > db.people.update({name: "Sarah"}, {$inc: {age: 2}}) > db.people.find({name: "Sarah"}) { "_id" :..., "name" : "Sarah", "profession" : "protector", "age" : 35 } Az age mező értékét megnöveljük 2-vel. Ha nem létezett a mező, akkor létrehozza 0 kezdőértékkel, s azt növeli meg. > db.people.find({name: "David"}) { "_id" :..., "name" : "David" } > db.people.update({name: "David"}, {$inc: {awards: 1}}) > db.people.find({name: "David"}) { "_id" :..., "name" : "David", "awards" : 1 } Egy mező értékének a csökkentésére nincs külön operátor. Megoldás: használjuk a $inc operátort negatív értékkel: > db.people.find({name: "Sarah"}) { "_id" :..., "name" : "Sarah", "profession" : "protector", "age" : 35 } > db.people.update({name: "Sarah"}, {$inc: {age: -5}}) > db.people.find({name: "Sarah"}) { "_id" :..., "name" : "Sarah", "profession" : "protector", "age" : 30 } 43
38 multi-update Mi a helyzet akkor, ha az update feltétele több dokumentumra is illeszkedik? Az alapértelmezés szerint az update csak az első dokumentumot fogja frissíteni, vagyis azt, amelyiket a keresés először visszaadja. Ha több dokumentumot is szeretnénk módosítani, akkor ezt explicit módon jelezni kell. > db.people.find() { "_id" :..., "name" : "John", "age" : 30, "profession" : "hacker" } { "_id" :..., "name" : "Jessie", "age" : 35, "profession" : "programmer" } > db.people.update({}, {$set: {age: 28}}) > db.people.find() { "_id" :..., "name" : "John", "age" : 28, "profession" : "hacker" } { "_id" :..., "name" : "Jessie", "age" : 35, "profession" : "programmer" } > db.people.update({}, {$set: {age: 28}}, {multi:true}) > db.people.find() { "_id" :..., "name" : "John", "age" : 28, "profession" : "hacker" } { "_id" :..., "name" : "Jessie", "age" : 28, "profession" : "programmer" } Az üres keresési feltétel ({}) valamennyi dokumentumra illeszkedik. Az első update során csak az egyik dokumentum módosult. A második esetben, amikor megadtuk a {multi: true} kapcsolót, már az összes. 44
39 upsert Az upsert művelet az update/insert műveleteket takarja. Ha a keresett dokumentum nem létezik, akkor insert-ként, ha létezik, akkor pedig update-ként funkcionál. > db.people.find() { "_id" :..., "name" : "John", "age" : 28, "profession" : "hacker" } > db.people.update({name: "George"}, {$set: {age: 22}}, {upsert: true}) > db.people.find() { "_id" :..., "name" : "John", "age" : 28, "profession" : "hacker" } { "_id" :..., "name" : "George", "age" : 22 } > db.people.update({name: "George"}, {$set: {age: 20}}, {upsert: true}) > db.people.find() { "_id" :..., "name" : "John", "age" : 28, "profession" : "hacker" } { "_id" :..., "name" : "George", "age" : 20 } Az upsert műveletet egy külön kapcsolóval ({upsert: true}) tudjuk jelezni. Az első upsert során még nem létezett a George nevű személy, ezért egy insert művelet hajtódott végre. A második esetben már létezett egy ilyen nevű illető, így a hozzá tartozó dokumentum csupán frissült (hagyományos update művelet). 45
40 műveletek tömbökkel (A dokumentumokban szereplő tömbök dinamikus tömbök, így a tömb és a lista elnevezéseket azonos értelemben fogjuk használni.) Hozzuk létre az alábbi dokumentumot: > db.arrays.insert({_id: 0, a: [1, 2, 3, 4, 5]}) Az alábbiakban bemutatunk néhány lista-műveletet. A műveleteket inkrementálisan hajtjuk végre, vagyis a bemenet mindig az előző lépés kimenete lesz. lista adott pozíciójú elemének módosítása > db.arrays.update({_id: 0}, {$set: {"a.2": 9}}) > db.arrays.find() { "_id" : 0, "a" : [ 1, 2, 9, 4, 5 ] } A lista indexelése 0-tól indul. A 2-es indexű elem értékét 9-re módosítjuk. $push lista bővítése jobbról > db.arrays.update({_id: 0}, {$push: {a: 6}}) > db.arrays.find() { "_id" : 0, "a" : [ 1, 2, 9, 4, 5, 6 ] } 46
41 $pop jobb szélső / bal szélső elem eltávolítása Jobb szélső elem törlése: > db.arrays.update({_id: 0}, {$pop: {a: 1}}) > db.arrays.find() { "_id" : 0, "a" : [ 1, 2, 9, 4, 5 ] } Bal szélső elem törlése: > db.arrays.update({_id: 0}, {$pop: {a: -1}}) > db.arrays.find() { "_id" : 0, "a" : [ 2, 9, 4, 5 ] } $pushall bővítés jobbról egy lista elemeivel > db.arrays.update({_id: 0}, {$pushall: {a: [10, 20, 30]}}) > db.arrays.find() { "_id" : 0, "a" : [ 2, 9, 4, 5, 10, 20, 30 ] } 47
42 $pull adott elem törlése (érték szerint megadva) Töröljük pl. a 20-as elemet (bárhol is van): > db.arrays.update({_id: 0}, {$pull: {a: 20}}) > db.arrays.find() { "_id" : 0, "a" : [ 2, 9, 4, 5, 10, 30 ] } $pullall felsorolt elemek törlése > db.arrays.update({_id: 0}, {$pullall: {a: [10, 5, 9]}}) > db.arrays.find() { "_id" : 0, "a" : [ 2, 4, 30 ] } $addtoset halmaz bővítése > db.arrays.update({_id: 0}, {$addtoset: {a: 4}}) > db.arrays.find() { "_id" : 0, "a" : [ 2, 4, 30 ] } > db.arrays.update({_id: 0}, {$addtoset: {a: 35}}) > db.arrays.find() { "_id" : 0, "a" : [ 2, 4, 30, 35 ] } Halmazként kezeli a listát. Ha az adott elem már benne van (itt a 4-es), akkor nem teszi bele. Ha az elem nincs benne (lásd 35-ös elem), akkor beleteszi. A duplikátumok így egyszerűen elkerülhetők. 48
43 remove Egy kollekcióból a következőképpen tudunk törölni: > db.people.remove( feltétel ) A feltételt ugyanúgy adjuk meg, mint a find() esetében. Ennek hatására törlődnek azok a dokumentumok, amelyek megfelelnek a feltételnek. Hogyan tudjuk kitörölni egy kollekció összes dokumentumát? 1) db.collection.remove({}) Az üres feltétel minden dokumentumra illeszkedik. 2) db.collection.drop() Ez törli az egész kollekciót. Az első esetben a dokumentumokat egyenként törli, de meghagyja az indexeket. A második esetben az egész kollekciót töröljük, így ez gyorsabb lesz, mint ha az elemeket egyenként törölnénk. Ez a második változat az indexeket is törli (míg az első nem). 49
44 Néhány példa Növeljük meg a pontszámát 20-szal minden olyan hallgatónak, aki 70-nél kevesebb ponttal rendelkezik. Először nézzük meg az érintett hallgatókat: > db.students.find({score: {$lt: 70}}) { "_id" :..., "name" : "Howard", "type" : "exam", "score" : 65 } { "_id" :..., "name" : "Patrick", "type" : "exam", "score" : 55 } Majd növeljük meg a pontszámukat. Vegyük figyelembe, hogy egynél több dokumentumot kell módosítani! > db.students.update({score: {$lt: 70}}, {$inc: {score: 20}}, {multi: true}) A végén ellenőrizzük le a módosításokat: > db.students.find() { "_id" :..., "name" : "George", "type" : "exam", "score" : 75 } { "_id" :..., "name" : "Howard", "type" : "exam", "score" : 85 } { "_id" :..., "name" : "Patrick", "type" : "exam", "score" : 75 } Töröljük a George nevű hallgatót. > db.students.remove({name: "George"}) WriteResult({ "nremoved" : 1 }) 50
45 CRUD műveletek Python-ban Az előzőekben megnéztük a CRUD műveleteket a mongo shell-ben. Most nézzük át, hogy egy Python alkalmazásból hogyan lehet meghívni ezeket a műveleteket. Python-hoz a pymongo csomag a hivatalos meghajtó (driver). A régebbi verziókban a Connection osztály használatát javasolták, de ez ma már elavult (deprecated). Az új verziók a MongoClient osztály használatát javasolják. A régi változat esetén íráskor a szervertől nem kaptunk visszaigazolást, minden aszinkron módon ment. Az új alapértelmezés szerint íráskor megvárjuk, míg a szerver visszaigazol. A MongoClient osztály már így működik. A find_one() függvény egy konkrét dokumentumot ad vissza. Ennek Python-beli típusa: szótár. 51
46 find Tekintsük az alábbi kollekciót: > db.students.find() { "_id" :..., "name" : "Howard", "type" : "exam", "score" : 85 } { "_id" :..., "name" : "Patrick", "type" : "exam", "score" : 75 } Python-ban a find() egy kurzort ad vissza. Ha ezen a kurzoron egy for ciklussal végigmegyünk, akkor megkapjuk az egyes dokumentumokat: Ez a kód a fenti két dokumentumot fogja kiírni. 52
47 projekció A projekció során az eredményként kapott dokumentumoknak csak bizonyos mezőit szeretnénk megtartani. A fenti kód kimenete (az előző oldalon látható kollekción futtatva): {u'name': u'howard'} {u'name': u'patrick'} (Python-ban a sztringek előtti u... prefix Unicode sztringet jelöl). 53
48 $gt $lt > db.students.find() { "_id" :..., "name" : "Patrick", "type" : "exam", "score" : 75 } { "_id" :..., "name" : "Jones", "type" : "exam", "score" : 80 } { "_id" :..., "name" : "Howard", "type" : "exam", "score" : 85 } { "_id" :..., "name" : "Adam", "type" : "exam", "score" : 90 } Kik azok, akiknek a vizsgajegyük pontszáma nagyobb, mint 75, de kisebb, mint 90? A fenti lekérdezés a Jones és Howard nevű diákok dokumentumait adja vissza. 54
49 sort, skip, limit A rendezés szintaxisa egy kicsit eltér a mongo shell-ben megszokottól: find(...).sort({title: 1}) find(...).sort( title, 1) # mongo shell # Python A sort második paraméterével tudjuk beállítani a rendezési sorrendet. Az 1 növekvő, míg a -1 csökkenő sorrendet jelent. Python-ban ezek helyett alkalmazhatók még a pymongo.ascending és pymongo.descending konstansok is. Vegyük az alábbi példát, s futtassuk le az előző oldalon látható kollekción: A négy hallgató név szerint sorba rendezve: Adam, Howard, Jones, Patrick. Ha az első kettőt átugorjuk, s a maradékból vesszük az elsőt, akkor a fenti kódrészlet a Jones-hoz tartozó dokumentumot fogja kiírni. 55
50 sort, skip, limit (folyt.) A sort, skip és limit függvényeket tetszőleges sorrendben hívhatjuk meg, viszont a MongoDB ezeket mindig a következő sorrendben fogja végrehajtani: 1) sort, 2) skip, 3) limit. Az adatbázisból az elemek lekérdezése majd csak akkor történik meg, amikor a kurzor objektumot elkezdjük iterálni. Mi a helyzet akkor, ha több mező szerint akarjuk rendezni a dokumentumokat? Előbb az egyik mező szerint, majd azon belül egy másik mező értéke alapján. A Python szintaxis itt is eltér egy kicsit a mongo shellben megszokottól: find(...).sort({student_id: 1, score: -1}) find(...).sort([( student_id, 1), ( score, -1)]) # mongo shell # Python Python esetében ilyenkor tuple-ök listáját kell megadni. Miért ez a szintaktikai eltérés? JSON-ban a kulcs/érték pároknak van egy sorrendje, viszont egy Python szótárban az elemeknek nincs kötött sorrendje. Ha több mező alapján szeretnénk rendezni, s Python szótárat használnánk, akkor az nem definiálná egyértelműen a mezők sorrendjét. 56
51 save A save segítségével egy Python szótárat tudunk dokumentumként elmenteni az adatbázisba: A program kimenete: {'name': 'Joe'} {'_id': ObjectId('54ee30eba e93f9c'), 'name': 'Joe'} Amikor egy szótárat beszúrunk az adatbázisba, akkor a driver megnézi, hogy van-e _id kulcsa. Ha nincs, akkor módosítja a szótárat és beletesz egy _id -t, ami egy ObjectId objektum lesz. A második print utasítás kimenete ezért tér el az első kimenettől. 57
52 save (folyt.) A save -vel nem csak beszúrni lehet, hanem egy adatbázisban lévő dokumentumot is tudunk vele módosítani: A program kimenete: {u'_id': ObjectId('54ee30eba e93f9c'), u'name': u'joe'} {u'age': 35, u'_id': ObjectId('54ee30eba e93f9c'), u'name': u'joe'} A find_one() egy konkrét dokumentumot ad vissza, amit a pymongo driver Python szótárrá alakít át. Ezt a szótárat kibővítjük egy új mezővel, majd a save függvénnyel elmentjük az adatbázisba. Mivel a doc objektum már rendelkezett egy _id mezővel, azért mentéskor az ezzel az _id -vel rendelkező dokumentumot frissíti. A save ilyenkor az adatbázisban lévő elemet felülírja. 58
53 update $set mező értékének beállítása / új mező hozzáadása A program kimenete: {u'age': 35, u'_id': ObjectId('54ee30eba e93f9c'), u'name': u'joe'} {u'age': 33, u'_id': ObjectId('54ee30eba e93f9c'), u'name': u'joe'} Itt egy mező értékét módosítjuk. Ez a megoldás hatékonyabb, mint az előző save függvény, mivel itt a BSON elemnek csak egy részét módítjuk, míg a save a teljes dokumentumot fölülírta. (BSON bináris JSON formátum. A MongoDB ilyen formában tárolja a kollekciók dokumentumait.) 59
54 upsert Az upsert művelet, mint már korábban is láttuk, az update és insert műveleteket vonja össze. Ha a WHERE feltételnek a megfelelője nem teljesül (vagyis nincs ilyen dokumentum), akkor egy insert, ellenkező esetben pedig egy update művelet fog végrehajtódni. A program kimenete: 0 {u'age': 22, u'_id': ObjectId(...), u'name': u'george'} {u'age': 30, u'_id': ObjectId(...)} 60
55 upsert (folyt.) Az előző oldalon látható kimenet magyarázata: Első lépésben a kollekciót töröljük, így a benne lévő dokumentumok száma 0. Ezután keresünk egy George nevű illetőt. Mivel nem létezik ilyen dokumentum, ezért az upsert egy insert műveletnek fog megfelelni. A létrejövő dokumentumnak van name és age mezője, s természetesen _id mezője is. Vegyük észre, hogy az upsert művelet beállítására Python-ban más szintaxist kell alkalmazni! A második esetben egy Joe nevű illetőt keresünk. Ilyen dokumentumunk sincs, ezért ismét egy insert művelet hajtódik végre. Viszont az eredmény most csak két mezővel fog rendelkezni: _id és age. Ennek az az oka, hogy a WHERE rész után megadott { age : 30} lesz a dokumentum tartalma. Az első esetben a $set tel hozzáadtunk egy új mezőt, itt viszont a dokumentum tartalmát a megadott értékre állítjuk be, ami csupán egyetlen mezőt (age) tartalmaz. A pymongo driver az _id mezőt automatikusan teszi be minden új dokumentumba. 61
56 Sématervezés A MongoDB használata során a nagy kérdés: az adatokat ágyazzuk be, vagy tegyük őket külön kollekcióba? Relációs adatbázis-kezelő rendszerek esetén a 3NF használata preferált. A MongoDB esetében viszont azt kell átgondolni, hogy az alkalmazásban hogyan akarjuk felhasználni az adatokat. Vagyis az alkalmazáshoz igazítjuk hozzá a sémát (Application-Driven Schema). Milyen adatokat használunk együtt? Mely adatokat olvassuk sokat? Mely adatokat módosítjuk sokat? ezeket a szempontokat is figyelembe kell venni Jellemzői: beágyazott adatok használata nincs join művelet atomiak a műveletek (de nincs tranzakció) egy kollekciónak nincs deklarált sémája (habár a dokumentumok általában eléggé hasonlóak) 62
57 Ha a sémánk úgy néz ki, mint egy RDBMS séma, akkor a MongoDB-t valószínűleg nem megfelelően használjuk. Vegyünk pl. egy blogot. Egy RDBMS rendszerben lenne egy post táblánk, ami a blogbejegyzéseket tartalmazza. Lehetséges mezők: cím, tartalom, létrehozási dátum. Egy post-hoz tartoznak kulcsszavak is, de a tag-eket már egy másik táblába kellene tenni (tags). Egy post-hoz tartoznak kommentek is, melyek egy harmadik táblába kerülnének (comments). Vagyis ha meg akarunk jeleníteni egy blogposztot, akkor ehhez legalább 3 táblát kellene felhasználnunk, ill. join művelettel összekapcsolni. MongoDB esetében egy post dokumentumba be lehet illeszteni a tag-eket egy listába. Ugyanígy a kommentek is beágyazhatók az adott posztba, elvégre egy post-hoz nem szokott túl sok komment tartozni. Itt a post-ok megjelenítéséhez csak egyetlen kollekció dokumentumait kell lekérdezni, s egy dokumentum minden szükséges adatot tartalmaz. 63
58 1:1 kapcsolat (One to One) Példa 1:1 kapcsolatra: Employee: Resume. Egy alkalmazottnak egy önéletrajza van, ill. egy önéletrajz egy alkalmazotthoz tartozik. Két lehetőségünk is van: 1) Különválasztjuk őket két kollekcióba. Az Alkalmazott tartalmaz egy resume_id t, míg az Önéletrajz tartalmaz egy employee_id t. 2) Beágyazás. Az önéletrajzot beágyazzuk az alkalmazott dokumentumába. Melyiket válasszuk? Egy dokumentum mérete a MongoDB-ben max. 16 MB lehet. Ha az alkalmazott és az önéletrajz összmérete ezt meghaladja, akkor nem lehetnek együtt. Ha az önéletrajz nagy (pl. képeket is tartalmaz), de ritkán van rá szükség, az alkalmazottat viszont gyakran olvassuk, akkor szét lehet őket választani. Ha az önéletrajz nagyon gyakran frissül, akkor is lehet külön. 1:1 kapcsolat esetében viszont a legtermészetesebb a beágyazás. Ha az előző speciális esetek nem állnak fenn, akkor nyugodtan be lehet ágyazni az önéletrajzot az alkalmazott dokumentumába. 64
59 1:N kapcsolat (One to Many / One to Few) Példa 1:N kapcsolatra: City: Person. Egy városnak sok lakója van, ill. egy személynek csak egy állandó lakhelye van. A város lakóit be lehetne tenni egy listába. Viszont egy város lakossága nagyon sok lehet, így ez a lista nagyon nagy méretűvé válna. Ebben az esetben a szétválasztás tűnik jó megoldásnak. Viszont mi a helyzet akkor, ha nem One to Many, hanem csak One to Few kapcsolatról van szó, vagyis amikor egy elemhez csak néhány elem tartozik? Gondoljunk vissza a blogposztos példára: egy poszthoz általában nem szokott túl sok komment tartozni. Ebben az esetben a kommentek beágyazhatók a blogposztba egy lista formájában. Összefoglalva: One to Many: One to Few: két kollekció használata lesz talán a legjobb megoldás beágyazás 65
60 N:M kapcsolat (Many to Many) Példa N:M kapcsolatra: Books: Authors. Egy könyvnek több szerzője is lehet, ill. egy szerzőnek lehet több könyve is. Books _id: 12 title: Vének háborúja authors: [20] Authors _id: 20 author_name: John Scalzi books: [12, 15, 18] Egy másik megoldás lehetne a beágyazás, de ez anomáliákhoz vezethet. Pl. az Authors alá tesszük be a könyveket. Ekkor ugyanaz a könyv több szerző alatt is ugyanúgy jelenne meg. Mi van akkor, ha módosítani akarjuk egy könyv adatait? Az összes helyen frissíteni kellene... 66
61 Indexek használata Alapesetben, ha keresünk valamit, akkor végigmegyünk az egész kollekción (collection scan). Ha nagy az adathalmaz, akkor ez nagyon lassú lesz. Ötlet: használjunk indexeket. Az indexben a kulcsok rendezetten szerepelnek. Ezen már gyorsan lehet keresni, ill. hatékony keresési algoritmusok is használhatók, pl. bináris keresés (a MongoDB valójában B-fát használ). Az indexben lévő kulcsot gyorsan meg tudjuk találni, majd a mutatót követve megvan a keresett dokumentum is. Ha van index: Az olvasás nagyon gyors. Az írás kicsivel lassabb lesz, mivel beszúráskor az indexet frissíteni kell. Vagyis nem kell mindenre indexet tenni! Csak arra tegyünk indexet, amit a leggyakrabban lekérdezünk. Egy adatbázis teljesítményére az indexek használata van a legnagyobb hatással. Ha jól választjuk meg az indexeket, akkor csak nagyon kevés lekérdezésnek kell teljesen végigszkennelni egy kollekciót. 70
62 Futtassuk le az alábbi szkriptet. Ez a students kollekcióba betesz 5 millió dokumentumot: Végezzünk el néhány lekérdezést: > db.students.find({student_id: }) Ez eltart néhány másodpercig. A find() az összes előfordulást megkeresi, nem csak az elsőt, vagyis az egész kollekciót végignézi. 71
63 További lekérdezések: > db.students.findone({student_id: 10}) A findone() csak az első találatig keres. Mivel ez a dokuemtum ott van a kollekció elején, ezért nagyon gyorsan végezni fog. > db.students.findone({student_id: }) Ez is lassú lesz. Igaz, hogy csak az első találatig keres, de ez a dokumentum nem a kollekció elején szerepel. index létrehozása > db.students.createindex({student_id: 1}) Ez a students kollekción létrehoz egy indexet. Mivel 5 millió dokumentumunk van, az index felépítése eltart egy pár percig. Az 1 -es érték jelentése: a student_id ra növekvő sorrendben építjük fel az indexet (a -1 jelentése csökkenő sorrend lenne). 72
64 Egy új index létrehozásakor visszajelzést is kapunk: > db.students.createindex({student_id: 1}) { "createdcollectionautomatically" : false, "numindexesbefore" : 1, "numindexesafter" : 2, "ok" : 1 } Vagyis: a parancs kiadása előtt egy index volt, majd végrehajtás után két indexünk lett. Minden kollekción van egy index, ami az _id mezőre épül fel. Ha most kipróbáljuk ismét a find() függvényt, akkor azt fogjuk tapasztalni, hogy szinte azonnal választ kapunk a lekérdezésre (pl. egy laptopon tesztelve index nélkül 2114 ms-ig tartott a lekérdezés, míg ugyanez index használatával 34 ms-ra csökkent). 73
65 index törlése > db.students.dropindex({student_id: 1}) Az index törlése a létrehozáshoz hasonlóan történik, csak itt a dropindex() függvényt kell meghívni. indexek felfedezése > db.system.indexes.find() ez az összes kollekcióról ad információt > db.students.getindexes() [ { "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "test.students" }, { "v" : 1, "key" : { "student_id" : 1 }, "name" : "student_id_1", "ns" : "test.students" } ] csak az adott kollekció indexeit mutatja 74
66 integritási megszorítások Tegyük fel, hogy az egyik mezőben csak egyedi (unique) értékeket akarunk engedélyezni. Ezt a megszorítást úgy tudjuk elérni, hogy az adott mezőre (vagy mezőkre) létrehozunk egy indexet, s unique-nak jelöljük meg. Pl. két diáknak ne lehessen azonos beceneve: > db.students.createindex({nickname: 1}, {unique: true}) Ha egy duplikátumot akarunk beszúrni, akkor hibát kapunk. Ha a kollekció már tartalmaz duplikátumokat egy mezőn, s arra unique indexet akarunk tenni, akkor hibát kapunk. A dropdups kapcsolóval eltávolíthatók a duplikátumok. Viszont ez egy veszélyes művelet! Nem lehet tudni, hogy melyik dokumentumot tartja meg egyedinek! Használata: > db.students.createindex({nickname: 1}, {unique: true, dropdups:true}) 75
67 explain Az explain() függvény egy lekérdezésről ad plusz információkat. Innen tudjuk kideríteni például, hogy a lekérdezés során mely indexeket használta a rendszer. > db.students.find({student_id: 400}).explain() { "cursor" : "BtreeCursor student_id_1", "ismultikey" : false, "n" : 1, "nscannedobjects" : 1, "nscanned" : 1, "nscannedobjectsallplans" : 1, "nscannedallplans" : 1, "scanandorder" : false, "indexonly" : false, "nyields" : 1, "nchunkskips" : 0, "millis" : 27, "indexbounds" : { "student_id" : [ [ 400, 400 ] ] }, "server" : "pybox:27017", "filterset" : false } BasicCursor: nem használt indexet BtreeCursor: használt indexet (itt a student_id mezőre felépítettet) n: találatok száma nscanned: hány dokumentumot kellett végignézni (itt az index miatt egyből megtaláltuk a keresett elemet) millis: a lekérdezés mennyi ideig tartott msec-ban 76
68 index mérete Egy kollekció, ill. a hozzá tartozó index(ek) méretét a következőképpen tudjuk lekérdezni: > db.students.stats() { "ns" : "test.students", "count" : , "size" : , "avgobjsize" : 48, "storagesize" : , "numextents" : 14, "nindexes" : 2, "lastextentsize" : , "paddingfactor" : 1, "systemflags" : 1, "userflags" : 1, "totalindexsize" : , "indexsizes" : { "_id_" : , "student_id_1" : }, "ok" : 1 } count: dokumentumok száma (itt most: 5 millió elem) avgobjsize: egy dokumentum átlagos mérete (itt: 48 byte) storagesize: a merevelemezen mennyi helyet foglal a kollekció (itt: 410 MB) totalindexsize: indexek összmérete (itt: 288 MB) Vagyis: az index nincs ingyen! Jól át kell gondolni, hogy mire teszünk indexet. 77
69 Full Text Search index Tegyük fel, hogy az adatbázisunkban nagyméretű szövegeket tárolunk, s ezekben hatékonyan szeretnénk tudni keresni. Ekkor a szöveget tartalmazó mezőre (itt: words mező) egy text típusú indexet érdemes tenni: > db.sentences.createindex({ words : text }) Keresés: > db.sentences.find({$text: {$search: herceg }}) A keresett herceg szó a szövegben bárhol előfordulhat, meg fogja találni. > db.sentences.find({$text: {$search: herceg macska kulcs }}) Ha több keresési kifejezést is megadunk, akkor ezeket ilyenkor logikai VAGY operátorral kapcsolja össze. Vagyis: keressük azokat a dokumentumokat, melyekben a herceg, macska, vagy kulcs szavak bármelyike előfordul. 78
70 Konklúzió Bepillantást nyertünk a MongoDB használatába, ami a legismertebb NoSQL adatbáziskezelő-rendszer. Láthattuk, hogy nem csak SQL-ben, ill. táblákban lehet gondolkodni, hanem (JSON) dokumentumokban is. Láttuk a parancssoros shell használatát. A MongoDB-hez léteznek grafikus adminisztrációs felületek is (pl. RockMongo). Láttuk, hogy hogyan lehet használni a Mongo-t egy alkalmazásból (Python). Ideális választás gyors prototípusfejlesztéshez, amikor menet közben alakul ki az adatbázis szerkezete (dinamikus sémák). Hivatalos (és ingyenes) kurzusok: Kik használják a MongoDB-t: 79
Szathmáry László Debreceni Egyetem Informatikai Kar
Szathmáry László Debreceni Egyetem Informatikai Kar 1. Gyakorlat bevezető JSON telepítés (utolsó módosítás: 2018. szept. 12.) 2018-2019, 1. félév MongoDB https://www.mongodb.com/ A MongoDB egy nem-relációs,
SQL ALAPOK. Bevezetés A MYSQL szintaxisa Táblák, adatok kezelésének alapjai
SQL ALAPOK Bevezetés A MYSQL szintaxisa Táblák, adatok kezelésének alapjai BEVEZETÉS SQL: Structured Query Language Strukturált Lekérdező Nyelv Szabvány határozza meg, azonban számos nyelvjárása létezik
Adatbázis Rendszerek I. 10. SQL alapok (DML esettanulmány)
Adatbázis Rendszerek I. 10. SQL alapok (DML esettanulmány) 23/1 B IT v: 2018.10.31 MAN DML adatokon műveletet végző utasítások DML Data Manipulation Language Rekordok (sorok) beszúrása (felvitele) Mezők
MySQL kontra MongoDB programozás. SQL és NoSQL megközelítés egy konkrét példán keresztül
MySQL kontra MongoDB programozás SQL és NoSQL megközelítés egy konkrét példán keresztül Kardos Sándor sandor@component.hu Miről lesz szó? Miért érdemes őket összehasonlítani? MySQL általános jellemzői
Java és web programozás
Budapesti Műszaki Egyetem 2015. 04. 08. 10. Előadás Ami kimearad múlthéten Ha már megvan a KeyListener vagy MouseListener osztályunk a következõ módon tudjuk hozzárendelni egy JFrame vagy JPanel-hez: Ami
SQL*Plus. Felhasználók: SYS: rendszergazda SCOTT: demonstrációs adatbázis, táblái: EMP (dolgozó), DEPT (osztály) "közönséges" felhasználók
SQL*Plus Felhasználók: SYS: rendszergazda SCOTT: demonstrációs adatbázis, táblái: EMP dolgozó), DEPT osztály) "közönséges" felhasználók Adatszótár: metaadatokat tartalmazó, csak olvasható táblák táblanév-prefixek:
Szkriptnyelvek. 1. UNIX shell
Szkriptnyelvek 1. UNIX shell Szkriptek futtatása Parancsértelmez ő shell script neve paraméterek shell script neve paraméterek Ebben az esetben a szkript tartalmazza a parancsértelmezőt: #!/bin/bash Szkriptek
A gyakorlat során MySQL adatbázis szerver és a böngészőben futó phpmyadmin használata javasolt. A gyakorlat során a következőket fogjuk gyakorolni:
1 Adatbázis kezelés 2. gyakorlat A gyakorlat során MySQL adatbázis szerver és a böngészőben futó phpmyadmin használata javasolt. A gyakorlat során a következőket fogjuk gyakorolni: Táblák létrehozása,
Java és web programozás
Budapesti M szaki Egyetem 2013. november 20. 10. El adás SQLite SQLite: Adatbázis kezel rendszer SQL standardokat nagyrészt követi Nagyon elterjedt, pl böngész kben is használt Nehéz olyan programnyelvet
MS ACCESS 2010 ADATBÁZIS-KEZELÉS ELMÉLET SZE INFORMATIKAI KÉPZÉS 1
SZE INFORMATIKAI KÉPZÉS 1 ADATBÁZIS-KEZELÉS MS ACCESS 2010 A feladat megoldása során a Microsoft Office Access 2010 használata a javasolt. Ebben a feladatban a következőket fogjuk gyakorolni: Adatok importálása
AB1 ZH mintafeladatok. 6. Minősítse az állításokat! I-igaz, H-hamis
AB1 ZH mintafeladatok 1. Töltse ki, és egészítse ki! Matematikai formalizmus arra, hogy hogyan építhetünk új relációkat a régi relációkból. Az adatoknak egy jól strukturált halmaza, amelyből információ
A gyakorlat során MySQL adatbázis szerver és a böngészőben futó phpmyadmin használata javasolt. A gyakorlat során a következőket fogjuk gyakorolni:
1 Adatbázis kezelés 3. gyakorlat A gyakorlat során MySQL adatbázis szerver és a böngészőben futó phpmyadmin használata javasolt. A gyakorlat során a következőket fogjuk gyakorolni: Tábla kapcsolatok létrehozása,
Az SQL nyelv Structured Query Language (Struktúrált lekérdező nyelv)
Az SQL nyelv Structured Query Language (Struktúrált lekérdező nyelv) Az SQL a relációs adatbázis-kezelő rendszerek ma legelterjedtebb szabványosított adatbáziskezelő nyelve. Az IBM dolgozta ki 1983-ban,
PHP-MySQL. Adatbázisok gyakorlat
PHP-MySQL Adatbázisok gyakorlat Weboldalak és adatbázisok Az eddigiek során megismertük, hogyan lehet a PHP segítségével dinamikus weblapokat készíteni. A dinamikus weboldalak az esetek többségében valamilyen
Felhasználói leírás a DimNAV Server segédprogramhoz ( )
Felhasználói leírás a DimNAV Server segédprogramhoz (1.1.0.3) Tartalomjegyzék Bevezetés...3 1. Telepítés...3 2. Eltávolítás...4 Program használata...5 1. Kezdeti beállítások...5 2. Licenc megadása...6
Vizuális programozás gyakorlat
Vizuális programozás gyakorlat A gyakorlat célja az entitás modell készítésének és az MS SQLEXPRESS használatának gyakorlása. A gyakorlat során egy könyvtári szoftver adatmodelljét tervezzük meg, valamint
Adatbázis használata PHP-ből
Adatbázis használata PHP-ből Adatbázis használata PHP-ből...1 Nyílt forráskódú adatbázisok...1 A mysql függvények...2 A mysqli függvények...4 Bináris adatok adatbázisban való tárolása...8 Adatbázis csatoló
Dr. Pál László, Sapientia EMTE, Csíkszereda WEB PROGRAMOZÁS 6.ELŐADÁS. Fájlkezelés PHP-ben
Dr. Pál László, Sapientia EMTE, Csíkszereda WEB PROGRAMOZÁS 6.ELŐADÁS 2015-2016 Fájlkezelés PHP-ben Fájlok és könyvtárak kezelése 2 A PHP a Javascript-hez hasonlóan, nem képes a felhasználó merevlemezén
IBM WebSphere Adapters 7. változat 5. alváltozat. IBM WebSphere Adapter for Oracle E-Business Suite felhasználói kézikönyv 7. változat 5.
IBM WebSphere Adapters 7. változat 5. alváltozat IBM WebSphere Adapter for Oracle E-Business Suite felhasználói kézikönyv 7. változat 5.kiadás IBM WebSphere Adapters 7. változat 5. alváltozat IBM WebSphere
Az SQL*Plus használata
Az SQL*Plus használata Célkitűzés Bejelentkezés az SQL*Plus-ba SQL utasítások szerkesztése Az eredmény formázása SQL*Plus utasításokkal Szkriptfájlok használata Az SQL és az SQL*Plus kapcsolata SQL*Plus
BASH script programozás II. Vezérlési szerkezetek
06 BASH script programozás II. Vezérlési szerkezetek Emlékeztető Jelölésbeli különbség van parancs végrehajtása és a parancs kimenetére való hivatkozás között PARANCS $(PARANCS) Jelölésbeli különbség van
Dr. Pál László, Sapientia EMTE, Csíkszereda WEB PROGRAMOZÁS 4.ELŐADÁS. Adatbázis alapú alkalmazások készítése PHP-ben
Dr. Pál László, Sapientia EMTE, Csíkszereda WEB PROGRAMOZÁS 4.ELŐADÁS 2015-2016 Adatbázis alapú alkalmazások készítése PHP-ben Adatbázis alapú alkalmazás 2 A leggyakrabban használt dinamikus alkalmazások
Választó lekérdezés létrehozása
Választó lekérdezés létrehozása A választó lekérdezés egy vagy több rekordforrásból származó adatokat jelenít meg. A választó lekérdezések a táblák, illetve az adatbázis tartalmát nem változtatják meg,
Adatbázis-lekérdezés. Az SQL nyelv. Makány György
Adatbázis-lekérdezés Az SQL nyelv Makány György SQL (Structured Query Language=struktúrált lekérdező nyelv): relációs adatbázisok adatainak visszakeresésére, frissítésére, kezelésére szolgáló nyelv. Születési
RapidMiner telepítés i. RapidMiner telepítés
i RapidMiner telepítés ii COLLABORATORS TITLE : RapidMiner telepítés ACTION NAME DATE SIGNATURE WRITTEN BY Jeszenszky, Péter 2014. szeptember 17. REVISION HISTORY NUMBER DATE DESCRIPTION NAME iii Tartalomjegyzék
PowerShell v2.0 alapok. Nagy Miklós
PowerShell v2.0 alapok Nagy Miklós Kezdetek, Felhasználás 2006-ban létrejött egy új script nyelv, mely Window Vista-ban, és Windows Server 2008-ban telepíthető opcióként jelenik meg. (PowerShell 1.0) Automatizáció
II. Mérés SZÉCHENYI ISTVÁN EGYETEM GYŐR TÁVKÖZLÉSI TANSZÉK
Mérési Utasítás Linux/Unix jogosultságok és fájlok kezelése Linux fájlrendszerek és jogosultságok Linux alatt, az egyes fájlokhoz való hozzáférések szabályozása érdekében a fájlokhoz tulajdonost, csoportot
Adatbázis-kezelő rendszerek. dr. Siki Zoltán
Adatbázis-kezelő rendszerek I. dr. Siki Zoltán Adatbázis fogalma adatok valamely célszerűen rendezett, szisztéma szerinti tárolása Az informatika elterjedése előtt is számos adatbázis létezett pl. Vállalati
HORVÁTH ZSÓFIA 1. Beadandó feladat (HOZSAAI.ELTE) ápr 7. 8-as csoport
10-es Keressünk egy egész számokat tartalmazó négyzetes mátrixban olyan oszlopot, ahol a főátló alatti elemek mind nullák! Megolda si terv: Specifika cio : A = (mat: Z n m,ind: N, l: L) Ef =(mat = mat`)
AWK programozás, minták, vezérlési szerkezetek
10 AWK programozás, minták, vezérlési szerkezetek AWK adatvezérelt szkriptnyelv text processing, adat kiterjesztés, tagolt adatok automatizált soronkénti feldolgozása a forrásállományt soronként beolvassa
A relációs adatbáziskezelés szabványos nyelve Két fő csoportba sorolhatók az utasításai
8. gyakorlat Structured Query Language Struktúrált lekérdező nyelv A relációs adatbáziskezelés szabványos nyelve Két fő csoportba sorolhatók az utasításai DDL (Data Definition Language) adatstruktúra definiáló
Adatbázisok* tulajdonságai
Gazdasági folyamatok térbeli elemzése 4. előadás 2010. 10. 05. Adatbázisok* tulajdonságai Rendezett, logikailag összefüggő és meghatározott szempont szerint tárolt adatok és/vagy információk halmaza Az
Adatbázisok. 8. gyakorlat. SQL: CREATE TABLE, aktualizálás (INSERT, UPDATE, DELETE), SELECT október október 26. Adatbázisok 1 / 17
Adatbázisok 8. gyakorlat SQL: CREATE TABLE, aktualizálás (INSERT, UPDATE, DELETE), SELECT 2015. október 26. 2015. október 26. Adatbázisok 1 / 17 SQL nyelv Structured Query Language Struktúrált lekérdez
Egészítsük ki a Drupal-t. Drupal modul fejlesztés
Egészítsük ki a Drupal-t Drupal modul fejlesztés Drupal 6.0 2008. február 13. Miért írjunk Drupal modult? Nincs az igényeinknek megfelelő modul Valamilyen közösségi igény kielégítése Valami nem úgy működik
SQL PÉLDATÁR. készült a PTE TTK Iskolai informatika III. kurzus teljesítésére
SQL PÉLDATÁR készült a PTE TTK Iskolai informatika III. kurzus teljesítésére PTE TTK Czimmermann Gergely MA matematika informatika tanár szakos hallgató 2017 Tartalomjegyzék 1. Adatleíró műveletek... 3
Adatbázis, adatbázis-kezelő
Adatbázisok I. rész Adatbázis, adatbázis-kezelő Adatbázis: Nagy adathalmaz Közvetlenül elérhető háttértárolón (pl. merevlemez) Jól szervezett Osztott Adatbázis-kezelő szoftver hozzáadás, lekérdezés, módosítás,
ADATBÁZIS-KEZELÉS - BEVEZETŐ - Tarcsi Ádám, ade@inf.elte.hu
ADATBÁZIS-KEZELÉS - BEVEZETŐ - Tarcsi Ádám, ade@inf.elte.hu Számonkérés 2 Papíros (90 perces) zh az utolsó gyakorlaton. Segédanyag nem használható Tematika 1. félév 3 Óra Dátum Gyakorlat 1. 2010.09.28.
Adatbázisok II. rész
Adatbázisok II. rész Érettségi feladatok Új adatbázist készítünk A táblákat a külső adatok menüfül szövegfájl pontjánál importáljuk (nem pedig megnyitjuk!) Fontos: az első sor tartalmazza az oszlopneveket
Algoritmusok és adatszerkezetek gyakorlat 06 Adatszerkezetek
Algoritmusok és adatszerkezetek gyakorlat 06 Adatszerkezetek Tömb Ugyanolyan típusú elemeket tárol A mérete előre definiált kell legyen és nem lehet megváltoztatni futás során Legyen n a tömb mérete. Ekkor:
Access alapok. Megnevezés Művelet Minta. Új adatbázis létrehozása. Új / Üres adatbázis.. Tábla létrehozása tervező nézetben.
Access alapok Megnevezés Művelet Minta Új adatbázis Új / Üres adatbázis.. A tábla mezőinek beállítása tervező nézetben Mezőnév = az adott oszlop neve, Adattípus = az oszlopban szereplő adatok mintája (szöveg,
Adatok szűrése, rendezése
Adatok szűrése, rendezése Célkitűzések Szűrést kifejező lekérdezések végrehajtása A lekérdezés eredményének rendezése &változó használata isql*plus-ban futási időben megadható feltételek céljából A lista
OO PDO. Tehát PDO használatával, könnyen átállhatunk egy másik adatbáziskezelőre, anélkül hogy a kódot teljes egészében újraírnánk.
OO PDO PDO VS MYSQLi VS MYSQL ================================================================================ A PHP mysql metódusai elavultak, helyette lehet hazsnálni a MYSQLi metódusokat, amelyek szinte
Gyakorlás: Hozzunk létre egy Alkalmazottak táblát AZO szám, Részleg szöveg, Munkakör szöveg és BelépésDátuma dátum típussal.
Adatbázis létrehozása Adatleíró műveletek CREATE DATABASE "tan1" WITH ENCODING= LATIN2 ; vagy parancssorból a terminál alatt $ createdb tan1 E=latin2 Kapcsolódás az adatbázishoz $ psql tan1 Adattábla létrehozása
SQLServer. SQLServer konfigurációk
SQLServer 2. téma DBMS installáció SQLServer konfigurációk 1 SQLServer konfigurációk SQLServer konfigurációk Enterprise Edition Standart Edition Workgroup Edition Developer Edition Express Edition 2 Enterprise
van neve lehetnek bemeneti paraméterei (argumentumai) lehet visszatérési értéke a függvényt úgy használjuk, hogy meghívjuk
függvények ismétlése lista fogalma, használata Game of Life program (listák használatának gyakorlása) listák másolása (alap szintű, teljes körű) Reversi 2 Emlékeztető a függvények lényegében mini-programok,
Fogalmak: Adatbázis Tábla Adatbázis sorai: Adatbázis oszlopai azonosító mező, egyedi kulcs Lekérdezések Jelentés Adattípusok: Szöveg Feljegyzés Szám
Fogalmak: Adatbázis: logikailag összefüggő információ vagy adatgyőjtemény. Tábla: logikailag összetartozó adatok sorokból és oszlopokból álló elrendezése. Adatbázis sorai: (adat)rekord Adatbázis oszlopai:
Listák, szótárak, fájlok Listák, szótárak, fájlok
lista fogalma, használata listák másolása (alap szintű, teljes körű) szótárak fogalma, használata adatbázis alkalmazás fejlesztése műveletek fájlokkal (megnyítás, írás, olvasás, lezárás) rejtjelező alkalmazás
Adatbázis rendszerek SQL nyomkövetés
Adatbázis rendszerek 1. 12. SQL nyomkövetés 1/32 B ITv: MAN 2017.10.26 Nyomkövetési feladat 2/32 Gyakorló feladatok Termék-Vásárlás-Vásárló Oktató-Tantárgy-Hallgató 3/32 Gyakorló feladat: Termék-Vásárlás-Vásárló
DAT adatcserefájl AutoCAD MAP DWG mapobject konvertáló program dokumentáció
H - 1161 Budapest Rákóczi út 76. Tel./Fax.: +36-1-4010159 http://www.pageos.hu toni@pageos.hu DAT adatcserefájl AutoCAD MAP DWG mapobject konvertáló program dokumentáció A program használható a TOPOBASE
Programozási technikák Pál László. Sapientia EMTE, Csíkszereda, 2009/2010
Programozási technikák Pál László Sapientia EMTE, Csíkszereda, 2009/2010 12. ELŐADÁS Adatbázis-kezelés Delphiben 2 Adatmegjelenítés lekérdezés segítségével A táblákhoz hasonlóan a lekérdezések is az adatbázis
BASH SCRIPT SHELL JEGYZETEK
BASH SCRIPT SHELL JEGYZETEK 1 TARTALOM Paraméterek... 4 Változók... 4 Környezeti változók... 4 Szűrők... 4 grep... 4 sed... 5 cut... 5 head, tail... 5 Reguláris kifejezések... 6 *... 6 +... 6?... 6 {m,n}...
Adatbázis Rendszerek II. 8. Gyakorló környezet
Adatbázis Rendszerek II. 8. Gyakorló környezet 1/24 B IT v: 2017.10.26 MAN Gyakorló környezet Géptermek 193.6.5.58:8080/apex H16_neptunkód ADMIN neptunkód 2/24 Jelszó váltás 1 2 3 4 3/24 Gyakorló környezet
Tájékoztató. Használható segédeszköz: -
A 35/2016. (VIII. 31.) NFM rendelet szakmai és vizsgakövetelménye alapján. Szakképesítés azonosítószáma és megnevezése 54 213 05 Szoftverfejlesztő Tájékoztató A vizsgázó az első lapra írja fel a nevét!
A szürke háttérrel jelölt fejezet/alfejezet szövege a CD-mellékleten található. A CD-melléklet használata. 1. Elméleti áttekintés 1
A szürke háttérrel jelölt fejezet/alfejezet szövege a CD-mellékleten található meg. A CD-melléklet használata Bevezetés xi xiii 1. Elméleti áttekintés 1 1.1. Adatmodellezés 3 1.2. Táblák, oszlopok és sorok
SQL jogosultság-kezelés. Privilégiumok Grant és Revoke Grant Diagrammok
SQL jogosultság-kezelés Privilégiumok Grant és Revoke Grant Diagrammok 1 Jogosultság-kezelés Egy fájlrendszer általában jogosultságokat rendel az általa kezelt objektumokhoz. Tipikusan olvasható, írható,
Tartalomjegyzék. Tartalomjegyzék 1. Az SQL nyelv 1 Az SQL DDL alapjai 2
Tartalomjegyzék Tartalomjegyzék 1 Az SQL nyelv 1 Az SQL DDL alapjai 2 Adatbázis parancsok 2 Táblaparancsok 2 A táblázat létrehozása 2 A táblázat módosítása 3 A tábla törlése 3 Indextábla létrehozása 3
BaBér bérügyviteli rendszer telepítési segédlete 2011. év
BaBér bérügyviteli rendszer telepítési segédlete 2011. év Ajánlott konfiguráció A program hardverigénye: Konfiguráció: 2800 MHz processzor 512 Mbyte memória (RAM) / Szerver gépen 1G memória (RAM) Lézernyomtató
Az alábbi kód egy JSON objektumot definiál, amiből az adtokat JavaScript segítségével a weboldal tartalmába ágyazzuk.
JSON tutorial Készítette: Cyber Zero Web: www.cyberzero.tk E-mail: cyberzero@freemail.hu Msn: cyberzero@mailpont.hu Skype: cyberzero_cz Fb: https://www.facebook.com/cyberzero.cz BEVEZETÉS: A JSON (JavaScript
AWK programozás Bevezetés
09 AWK programozás Bevezetés AWK adatvezérelt szkriptnyelv text processing, adat kiterjesztés, tagolt adatok automatizált soronkénti feldolgozása a forrásállományt soronként beolvassa és feldolgozhatóvá
SZÁMÍTÓGÉPES ADATBÁZIS-KEZELÉS. A MySQL adatbáziskezelő PHP folytatás JDBC, ODBC
SZÁMÍTÓGÉPES ADATBÁZIS-KEZELÉS A MySQL adatbáziskezelő PHP folytatás JDBC, ODBC ADATBÁZISOK Adatbázis = adott formátum és rendszer szerint tárolt adatok összessége. DBMS feladatai: adatstruktúra (adatbázisséma)
Adatbázis rendszerek. dr. Siki Zoltán
Adatbázis rendszerek I. dr. Siki Zoltán Adatbázis fogalma adatok valamely célszerűen rendezett, szisztéma szerinti tárolása Az informatika elterjedése előtt is számos adatbázis létezett pl. Vállalati személyzeti
Relációs algebra áttekintés és egy táblára vonatkozó lekérdezések
Relációs algebra áttekintés és egy táblára vonatkozó lekérdezések Tankönyv: Ullman-Widom: Adatbázisrendszerek Alapvetés Második, átdolgozott kiadás, Panem, 2009 2.4. Relációs algebra (áttekintés) 5.1.
Google Drive szinkronizálása asztali géppel Linux rendszeren
Google Drive szinkronizálása asztali géppel Linux rendszeren Ha valamilyen Ubuntu disztribúciót használsz, akkor nincs nehéz dolgod a telepítést illetően, hiszen egyszerűen PPA tárolóban is elérhető. Az
Algoritmusok és adatszerkezetek 2.
Algoritmusok és adatszerkezetek 2. Varga Balázs gyakorlata alapján Készítette: Nagy Krisztián 1. gyakorlat Nyílt címzéses hash-elés A nyílt címzésű hash táblákban a láncolással ellentétben egy indexen
Lekérdezések I. Egyszerű választó lekérdezések
Lekérdezés létrehozása: A Varázslóval: Lekérdezések I. Egyszerű választó lekérdezések 1. Lekérdezés sáv Lekérdezés varázsló 2. Tábla (vagy lekérdezés) kiválasztása. 3. Szükséges mezők átvitele a kijelölt
BaBér. Bérügyviteli rendszer. Telepítési segédlet 2014.
BaBér Bérügyviteli rendszer Telepítési segédlet 2014. Tartalom 1. Ajánlott konfiguráció... 3 2. A BaBér és az SQL2005 szerver telepítése... 5 3. A BaBér program és az SQL2005-ös adatbázis kezelő telepítése...
Lekérdezések az SQL SELECT utasítással
Lekérdezések az SQL SELECT utasítással Az SQL SELECT utasítás lehetőségei Vetítés Kiválasztás 1. tábla 1. tábla Összekapcsolás 1. tábla 2. tábla Elemi SELECT utasítások SELECT * {[DISTINCT] column expression
Telepítés, újratelepítés több számítógépre, hálózatos telepítés Kulcs-Bér program
Telepítés, újratelepítés több számítógépre, hálózatos telepítés Kulcs-Bér program A Kulcs-Soft programok telepítése (újratelepítése) előtt javasolt Adatmentést készíteni a számítógépen található összes
Az indexelés újdonságai Oracle Database 12c R1 és 12c R2
Az indexelés újdonságai Oracle Database 12c R1 és 12c R2 Szabó Rozalinda Oracle adattárház szakértő, oktató szabo.rozalinda@gmail.com Index tömörítés fejlődése 8.1.3-as verziótól: Basic (Prefixes) index
Occam 1. Készítette: Szabó Éva
Occam 1. Készítette: Szabó Éva Párhuzamos programozás Egyes folyamatok (processzek) párhuzamosan futnak. Több processzor -> tényleges párhuzamosság Egy processzor -> Időosztásos szimuláció Folyamatok közötti
1. Gyakorlat: Telepítés: Windows Server 2008 R2 Enterprise, Core, Windows 7
1. Gyakorlat: Telepítés: Windows Server 2008 R2 Enterprise, Core, Windows 7 1.1. Új virtuális gép és Windows Server 2008 R2 Enterprise alap lemez létrehozása 1.2. A differenciális lemezek és a két új virtuális
Apache, MySQL, PHP/Perl NetWare-n
Apache, MySQL, PHP/Perl NetWare-n www.novell.hu termékleírás Bevezető Az alábbi dokumentumban szeretnénk segítséget adni a NetWare 6, az Apache, a MySQL* és a PHP/Perl (továbbiakban NetWare AMP) környezet
PHP. Telepítése: Indítás/újraindítás/leállítás: Beállítások: A PHP nyelv
PHP A PHP rövidítés jelentése hivatalosan: PHP Hypertext Preprocessor. Ez egy kiszolgáló-oldali parancsnyelv, amit jellemzően HTML oldalakon használnak. A különbség a két nyelv között az, hogy a kiszolgáló
SELECT DISTINCT deptno FROM emp; (distinct) SELECT STATEMENT HASH UNIQUE TABLE ACCESS FULL EMP
SELECT * FROM emp; SELECT ename FROM emp; (projekció) SELECT ename FROM emp WHERE ename='jones'; (szelekció) ------------------------------------------ SELECT DISTINCT deptno FROM emp; (distinct) --------------------------------
Adabáziselérés ODBC-n keresztül utasításokkal C#-ban
Adabáziselérés ODBC-n keresztül utasításokkal C#-ban 1. Előkészítés Access adatbázis lemásolása, ODBC DSN létrehozása Másoljuk le az alábbiakat: Mit Honnan Hova list.mdb p:\johanyák Csaba\Vizualis programozas\data\
Tematika. MongoDB koncepció JSON Schemaless logika Replicaset képzés Sharding Aggregate framework
MONGODB Tematika MongoDB koncepció JSON Schemaless logika Replicaset képzés Sharding Aggregate framework Koncepció párhuzamosítás: hardver infrastruktúra adta lehetőségeket kihasználni (sok szerver, sok
Adatbázisok elmélete 9. előadás
Adatbázisok elmélete 9. előadás Katona Gyula Y. Budapesti Műszaki és Gazdaságtudományi Egyetem Számítástudományi Tsz. I. B. 137/b kiskat@cs.bme.hu http://www.cs.bme.hu/ kiskat 2005 ADATBÁZISOK ELMÉLETE
SQL. Táblák összekapcsolása lekérdezéskor Aliasok Allekérdezések Nézettáblák
SQL Táblák összekapcsolása lekérdezéskor Aliasok Allekérdezések Nézettáblák A SELECT UTASÍTÁS ÁLTALÁNOS ALAKJA (ISM.) SELECT [DISTINCT] megjelenítendő oszlopok FROM táblá(k direkt szorzata) [WHERE feltétel]
8. Gyakorlat SQL. DDL (Data Definition Language) adatdefiníciós nyelv utasításai:
8. Gyakorlat SQL SQL: Structured Query Language; a relációs adatbáziskezelők szabványos, strukturált lekérdező nyelve SQL szabványok: SQL86, SQL89, SQL92, SQL99, SQL3 Az SQL utasításokat mindig pontosvessző
OCSP Stapling. Az SSL kapcsolatok sebességének növelése Apache, IIS és NginX szerverek esetén 1(10)
OCSP Stapling Az SSL kapcsolatok sebességének növelése Apache, IIS és NginX szerverek esetén 1(10) 1. Tartalomjegyzék 1. Tartalomjegyzék... 2 2. Bevezető... 3 3. OCSP Stapling támogatással rendelkező webszerverek...
Operációs rendszerek. 9. gyakorlat. Reguláris kifejezések - alapok, BASH UNIVERSITAS SCIENTIARUM SZEGEDIENSIS UNIVERSITY OF SZEGED
UNIVERSITAS SCIENTIARUM SZEGEDIENSIS UNIVERSITY OF SZEGED Reguláris kifejezések - alapok, BASH Operációs rendszerek 9. gyakorlat Szegedi Tudományegyetem Természettudományi és Informatikai Kar Csuvik Viktor
Alapok. tisztán funkcionális nyelv, minden függvény (a konstansok is) nincsenek hagyományos változók, az első értékadás után nem módosíthatók
Haskell 1. Alapok tisztán funkcionális nyelv, minden függvény (a konstansok is) nincsenek hagyományos változók, az első értékadás után nem módosíthatók elég jól elkerülhetők így a mellékhatások könnyebben
SQL haladó. Külső összekapcsolások, Csoportosítás/Összesítés, Beszúrás/Törlés/Módosítás, Táblák létrehozása/kulcs megszorítások
SQL haladó Külső összekapcsolások, Csoportosítás/Összesítés, Beszúrás/Törlés/Módosítás, Táblák létrehozása/kulcs megszorítások 1 Külső összekapcsolás Összekapcsoljuk R és S relációkat: R C S. R azon sorait,
Bérprogram vásárlásakor az Ügyfélnek e-mailben és levélben is megküldjük a termék letöltéséhez és aktiválásához szükséges termékszámot.
Telepítés Bérprogram vásárlásakor az Ügyfélnek e-mailben és levélben is megküldjük a termék letöltéséhez és aktiválásához szükséges termékszámot. A programot honlapunkról, az alábbi linkről tudják letölteni:
Adatbáziskezelés alapjai. jegyzet
Juhász Adrienn Adatbáziskezelés alapja 1 Adatbáziskezelés alapjai jegyzet Készítette: Juhász Adrienn Juhász Adrienn Adatbáziskezelés alapja 2 Fogalmak: Adatbázis: logikailag összefüggı információ vagy
Merevlemez üzembe helyezése, particionálása
Merevlemez üzembe helyezése, particionálása (gyakorlati) A meghajtók és partíciók fogalma A meghajtó egy fizikai tárolóeszközt, például a merevlemez-meghajtó vagy a cserélhető USB-meghajtó. A partíció
Adatbázis-kezelés. Harmadik előadás
Adatbázis-kezelés Harmadik előadás 39 Műveletek csoportosítása DDL adat definiálás Objektum létrehozás CREATE Objektum törlés DROP Objektum módosítás ALTER DML adat módosítás Rekord felvitel INSERT Rekord
file:///d:/okt/ad/jegyzet/ad1/b+fa.html
1 / 5 2016. 11. 30. 12:58 B+ fák CSci 340: Database & Web systems Home Syllabus Readings Assignments Tests Links Computer Science Hendrix College Az alábbiakban Dr. Carl Burch B+-trees című Internetes
ADATBÁZISOK gyakorlat: SQL 2. rész SELECT
ADATBÁZISOK 9-10. gyakorlat: SQL 2. rész SELECT SELECT utasítás általános alakja SELECT [DISTINCT] oszloplista FROM táblanévlista [WHERE feltétel] [GROUP BY oszloplista [HAVING feltétel] ] [ORDER BY oszloplista];
AWK programozás, minták, vezérlési szerkezetek
10 AWK programozás, minták, vezérlési szerkezetek AWK futtatási módok AWK parancs, közvetlen programkódmegadás: awk 'PROGRAMKÓD' FILE példa: ls -l awk '{print $1, $5}' a programkód helyére minden indentálás
Az állományokban UTF-8 kódolással magyar betűk is vannak, ezért az az Unicode (UTF-8) kódolást.
Adatok importálása Importáld az előző órákon használt adatbázisba a következő táblákat (a megadott TXT file-ból). External Data > Import & Link > Text file FIGYELEM! Az első sor minden esetben a mezőneveket
Téradatbázisok használata QGIS-ből A DB kezelő modul 2.2 verzió
Téradatbázisok használata QGIS-ből A DB kezelő modul 2.2 verzió A QGIS programból számos téradatbázis adatait elérhetjük, ezek közül két nyílt forráskódúval foglalkozunk, a PostGIS és a SpatiaLite adatbázis
Ügyviteli rendszerek hatékony fejlesztése Magic Xpa-val mobilos funkciókkal kiegészítve. Oktatók: Fülöp József, Smohai Ferenc, Nagy Csaba
Ügyviteli rendszerek hatékony fejlesztése Magic Xpa-val mobilos funkciókkal kiegészítve Oktatók: Fülöp József, Smohai Ferenc, Nagy Csaba Programozás alapjai Ha egy adott adattáblára Ctrl + G t nyomunk,
1.2. NFS kliens telepítése és beállítása
Hálózati adminisztráció Linux (Ubuntu 9.04) 10. gyakorlat Johanyák Zsolt Csaba 1 NFS és Samba szolgáltatások telepítése és beállítása Az NFS segítségével könyvtárakat oszthatunk meg Linux operációs rendszert
FTP Az FTP jelentése: File Transfer Protocol. Ennek a segítségével lehet távoli szerverek és a saját gépünk között nagyobb állományokat mozgatni. Ugyanez a módszer alkalmas arra, hogy a kari web-szerveren
Angol szótár V2.0.0.0
Angol szótár V2.0.0.0 Bemutató Verzió Felhasználói Kézikönyv Készítette: Szűcs Zoltán. 2536 Nyergesújfalu, Pala u. 7. Tel \ Fax: 33-355 - 712. Mobil: 30-529-12-87. E-mail: info@szis.hu. Internet: www.szis.hu.
Entity Framework alapú adatbáziselérés
Entity Framework alapú adatbáziselérés Dr. Johanyák Zsolt Csaba http://johanyak.hu A gyakorlat célja Model-first megközelítéssel Entity-Framework modell létrehozása, majd ebből adatbázis generálása LocalDB-ben.
Adatbázis kezelés Delphiben. SQL lekérdezések
Adatbázis kezelés Delphiben. SQL lekérdezések Structured Query Language adatbázisok kezelésére szolgáló lekérdező nyelv Szabályok: Utasítások tetszés szerint tördelhetők Utasítások végét pontosvessző zárja
A GeoEasy telepítése. Tartalomjegyzék. Hardver, szoftver igények. GeoEasy telepítése. GeoEasy V2.05 Geodéziai Feldolgozó Program
A GeoEasy telepítése GeoEasy V2.05 Geodéziai Feldolgozó Program (c)digikom Kft. 1997-2008 Tartalomjegyzék Hardver, szoftver igények GeoEasy telepítése A hardverkulcs Hálózatos hardverkulcs A GeoEasy indítása
MŰSZAKI DOKUMENTÁCIÓ. Aleph WebOPAC elérhetővé tétele okostelefonon. Eötvös József Főiskola 6500 Baja, Szegedi út 2.
Telefon: Fax: E-mail: (+36-1) 269-1642 (+36-1) 331 8479 info@ex-lh.hu www.ex-lh.hu Eötvös József Főiskola 6500 Baja, Szegedi út 2. MŰSZAKI DOKUMENTÁCIÓ Aleph WebOPAC elérhetővé tétele okostelefonon Pályázati