Database Reference
In-Depth Information
Als Nächstes würden wir den Code direkt auf dem Server ausführen. Die
eval
-Funktion übergibt den String an den Server, evaluiert ihn als Java-
Script-Code und gibt das Ergebnis zurück.
> db.eval(
'getLast(db.phones)'
)
Das sollte das gleiche Ergebnis zurückliefern wie der lokale Aufruf von
get-
Last(collection)
.
> db.system.js.findOne({
'
_
id'
:
'getLast'
}).value(db.phones)
Beachten Sie aber, dass
eval()
den Mongo-Daemon
mongod
während der Aus-
führung blockiert, d. h., es eignet sich hauptsächlich für einmalige Dinge
oder für Tests, nicht aber für Prozeduren im Produktiveinsatz. Sie können
diese Funktion auch innerhalb von
$where
und bei Mapreduce verwenden.
Nun haben wir alle Dinge beisammen, um Mapreduce unter MongoDB zu
nutzen.
Mapreduce (und Finalize)
Das Mapreduce-Muster von Mongo ähnelt Riak, es gibt aber einige kleine Un-
terschiede. Statt die
map
-Funktion einen umgewandelten Wert zurückliefern
zu lassen, verlangt Mongo zum Mappen den Aufruf einer
emit
-Funktion mit
einem Schlüssel. Der Vorteil besteht darin, dass Sie für ein Dokument mehr
als einmal „emittieren“ können. Die
reduce
-Funktion verlangt einen einzel-
nen Schlüssel und eine Liste von Werten, die für diesen Schlüssel emittiert
wurden. Mongo kennt schließlich noch einen optionalen dritten Schritt na-
mens
finalize
, der für jeden abgebildeten Wert nur einmal ausgeführt wird,
nachdem alle Reducer gelaufen sind. Auf diese Weise können Sie abschlie-
ßende Berechnungen oder Aufräumarbeiten durchführen, falls das notwen-
dig sein sollte.
Da wir die Grundlagen von Mapreduce bereits kennen, sparen wir uns ein
einleitendes Beispiel und steigen gleich richtig ein. Wir wollen einen Bericht
erstellen, der alle Telefonnummern zählt, die (nach Land) die gleichen Zif-
fern enthalten. Zuerst speichern wir eine Hilfsfunktion, die ein Array al-
ler unterschiedlichen Nummern erzeugt. (Wie die Hilfsfunktion funktioniert,
ist für das Verständnis der Mapreduce-Gesamtoperation nicht von
Bedeutung.)