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 ]