MongoDB, VIII

De bibliotheek van het Vredespaleis is op diverse manieren betrokken bij een publicatie met de welluidende titel “Les livres de droit de l’Académie / Académie de Droit International de la Haye = The law books of the Academy / Hague Academy of International Law”. Zo is onder de begeleiding van de bibliotheek de inhoud van deze publicatie gescand en vervolgens is iedere aangemaakte pdf-file van meta informatie voorzien. Het resultaat van deze inspanning is vervolgens ter beschikking gesteld aan uitgever en aan de Haagse Academie van Internationaal recht, de opdrachtgever zou je kunnen zeggen.

Omdat de aantallen wel mee vallen leek het mij wel een aardig idee om eens te kijken naar MongoDB en de voorziening om files in de database op te nemen, GridFS. GridFS geeft de Mongo gebruiker de gelegenheid om hetzij vanaf de shell, hetzij middels een PHP script files, in ons geval dus pdf-files van Centre delen, in een aparte omgeving van de desbetreffende database in te lezen.

Ik maakte gebruik van het meegeleverde ‘mongofiles’ een programma dus, waarmee files in de database kunnen geplaatst in de shell. De syntax is simpel: mongofiles –db centre put c:/centre/054067359.pdf; je duidt dus de database aan waar de file bij hoort en de naam van de file die ingelezen moet worden. En omdat we in een ‘ouderwetse’ shell zitten, werkt een ‘ouderwetse’ batch file in de shell ook gewoon:
mongofiles –db centre put c:/centre/054067529.pdf
mongofiles –db centre put c:/centre/079181937.pdf
mongofiles –db centre put c:/centre/096961872.pdf
mongofiles –db centre put c:/centre/096961929.pdf
etc.

Via de batch file werden razendsnel 175 pdf-files aan de centre database toegevoegd, de files komen terecht in een aparte collectie: fs.files. Een record in deze collectie van een dergelijk ingelezen file zit er zo uit:

[{
“_id” : ObjectId(“4e15af816b70efa870336352”),
“filename” : “c:/centre/054067529.pdf”,
“chunkSize” : 262144,
“uploadDate” : ISODate(“2011-07-07T13:07:13.504Z”),
“md5” : “5001a39711d41ab922f378fe37b09350”,
“length” : NumberLong(2824559)
}]

Het voert te ver om hier uit te leggen waar de diverse ‘velden’ voor staan (chunkSize, md5), maar duidelijk is in ieder geval dat iedere ingelezen file weer een eigen Mongo ObjectId heeft en wat de ‘oorspronkelijke’ filenaam is geweest. Aan de hand van deze twee elementen is het mogelijk om de metadata die eerder in een aparte collectie (‘publications’ genaamd) is opgeslagen te verrijken, opdat het mogelijk wordt om die metadata te koppelen aan de in de database opgeslagen pdf-file. Daarvoor heb ik een phpscriptje geschreven dat hiernaast in de scriptstabel van deze blog is terug te vinden en dat bedoeld is om in één slag de metadata te kunnen koppelen aan de files.

Een record na het uitvoeren van het script ziet er zo uit:

[{
“_id” : ObjectId(“4e16af847e2c837805000036”),
“fnm” : “Martti”,
“gridid” : ObjectId(“4e15a2dd520ab3562e170214”),
“lan” : “eng”,
“lnm” : “Koskenniemi”,
“pag” : “65-132”,
“ppn” : “318822709”,
“ppn_s” : “194928101”,
“pub” : “The Hague [etc.]”,
“ttl” : “Report of the Director of Studies of the English-speaking Section of the Centre”,
“ttl_s” : “La succession d’?®tats : la codification ?í l’?®preuve des faits = State succession : codification tested against the facts”,
“yea” : “2000”
}]

U ziet het, er staat ook een gridid in dit record met een aanduiding die verwijst naar de fs.files collectie: “gridid” : ObjectId(“4e15a2dd520ab3562e170214”).

De laatste stap in mijn experiment was het schrijven van een eenvoudige interface om een file op te halen aan de hand van een zoekopdracht, bijvoorbeeld op auteur of titelwoord. Uiteraard maak ik dan gebruik van het unieke gridid.

Tot slot, ik kan niets met zekerheid zeggen over de performance. Het lijkt voor de hand te liggen dat een bestand uit een database sneller kan worden getoond, omdat immers niet eerst een link naar een andere plaats op een server hoeft opgebouwd te worden of zoiets. Daarentegen is de database veel groter, omdat er ‘meer in zit’ en ik kan niet zo goed beoordelen of dat wat uitmaakt. En bovendien lopen de scripts op de localhost, zeg mijn eigen pc, en die is pas nieuw en dus bloedsnel en van netwerkverkeer is eigenlijk nauwelijks sprake.

Script met twee ‘cursors’ dat informatie ophaalt uit een collectie en die info vervolgens in een andere collectie plaatst.

$m = new Mongo();
$db = $m->centre;
$collection_grid=$db->fs->files;
$collection_pubs=$db->publications;
$cursor_grid = $collection_grid->find();

foreach($cursor_grid as $obj_grid){
$name=$obj_grid[“filename”];

//wat code om uit de $name de juiste query opdracht te destilleren

$name=”/”.$name.”/i”;
$gridid=$obj_grid[“_id”];
$regexQuery = new MongoRegex($name);
$where = array(“ppn” => $regexQuery);
$cursor_pubs = $collection_pubs->find($where);
$options=array(‘upsert’=>true, ‘multi’=> false);
$update=array(‘$set’=> array(‘gridid’=>$gridid));
foreach($cursor_pubs as $obj_pubs){
$collection_pubs->update($where,$update,$options);
}
}

Script [in de vorm van een plaatje anders loopt WordPress vast!] dat met behulp van het gridid (term) de pdf-file ophaalt en toont.

 

 

 

Eenvoudige zoekinterface:

 

 

 

 

Eenvoudig resultaatscherm:

 

 

 

Simpele presentatie van de pdf-file:

 

 

 

 

 

 

Dit bericht is geplaatst in mongodb met de tags , , . Bookmark de permalink.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *