Database Reference
In-Depth Information
Die beiden folgenden Beispiele sind zugegebenermaßen an den Haaren her-
beigezogen. Sie sollen nur die Flexibilität von group verdeutlichen.
Sie können die count -Funktion sehr einfach mit dem folgenden group -Aufruf
nachbauen. Den aggregierenden key lassen wir hier weg:
db.phones.group({
initial: { count:0 },
reduce: function (phone, output) { output.count++; },
cond:
{ 'components.number' : { $gt : 5599999 } }
})
[{ "count" : 100000 } ]
Hier haben wir zuerst ein Anfangsobjekt erzeugt, bei demwir ein Feld namens
count auf 0 gesetzt haben - hier angelegte Felder erscheinen in der Ausgabe.
Als Nächstes beschreiben wir, was mit diesem Feld geschehen soll, indem
wir eine Reduce-Funktion deklarieren, die für jedes gefundene Dokument
eine 1 hinzuaddiert. Zum Schluss legen wir in einer Bedingung fest, über
welche Dokumente der Reduce laufen soll. Unser Ergebnis entspricht count ,
weil die Bedingung identisch war. Wir haben den Schlüssel weggelassen, weil
jedes erkannte Dokument zu unserer Liste hinzugefügt werden sollte.
Wir können auch die distinct -Funktion nachbauen. Aus Performancegrün-
den erzeugen wir zuerst ein Objekt, das die Zahlen als Felder speichert (tat-
sächlich erzeugen wir einen Ad-hoc- set ). In der Reduce-Funktion (die für
jedes passende Dokument ausgeführt wird) setzen wir einfach den Wert als
Platzhalter auf 1 (das ist das Feld, das wir wollen).
Technisch ist das alles, was wir brauchen. Wenn wir distinct aber tatsäch-
lich nachbauen wollen, müssen wir ein Array von Integerwerten zurückge-
ben. Daher fügen wir eine finalize(out) -Methode hinzu, die vor der Rückga-
be eines Wertes einmal ausgeführt wird. Sie wandelt das Objekt in ein Array
von Feldwerten um. Die Funktion wandelt diese Zahlenstrings dann in Inte-
gerwerte um. (Wenn Sie es wirklich ganz genau wissen wollen, dann führen
Sie den folgenden Code ohne finalize aus).
db.phones.group({
initial: { prefixes : {} },
reduce: function (phone, output) {
output.prefixes[phone.components.prefix] = 1;
},
finalize: function (out) {
var ary = [];
for ( var p in out.prefixes) { ary.push( parseInt( p ) ); }
out.prefixes = ary;
}
})[0].prefixes
[ 555, 556, 557, 558, 559, 560, 561, 562, 563, 564 ]
Search WWH ::




Custom Search