Database Reference
In-Depth Information
mongo/distinct_digits.js
distinctDigits =
function
(phone){
var
number = phone.components.number +
''
,
seen = [],
result = [],
i = number.length;
while
(i-) {
seen[+number[i]] = 1;
}
for
(i=0; i<10; i++) {
if
(seen[i]) {
result[result.length] = i;
}
}
return
result;
}
db.system.js.save({
_
id:
'distinctDigits'
, value: distinctDigits})
Laden Sie die Datei in die
mongo
-Kommandozeile. Wenn die Datei im gleichen
Verzeichnis liegt, in dem Sie
mongo
gestartet haben, müssen Sie nur den Da-
teinamen angeben, anderenfalls wird der vollständige Pfad benötigt.
> load(
'distinct
_
digits.js'
)
Nachdem das erledigt ist, können Sie einen kurzen Test durchführen (wenn
es Probleme gibt, sollten Sie sich nicht scheuen, einige
print
-Funktionen
einzustreuen).
db.eval(
"distinctDigits(db.phones.findOne({ 'components.number' : 5551213 }))"
)
[1,2,3,5]
Nun können wir am Mapper arbeiten. Wie bei jeder Mapreduce-Funktion ist
die wichtigste Entscheidung, welche Felder abgebildet werden sollen, da das
die zurückgegebenen aggregierten Werte bestimmt. Da unser Bericht eindeu-
tige Nummern zurückgibt, ist das Array eindeutiger Werte ein Feld. Doch weil
wir auch das Land abfragenmüssen, ist dies ein weiteres Feld. Wir verwenden
beide Werte als zusammengesetzten Schlüssel:
{digits : X, country : Y}
.
Unser Ziel besteht einfach darin, diese Werte zu zählen, d. h., wir emittie-
ren einfach den Wert 1 (jedes Dokument ist ein zu zählendes Element). Die
Aufgabe des Reducers besteht darin, die ganzen Einsen zu addieren.
mongo/map_1.js
map =
function
() {
var
digits = distinctDigits(
this
);
emit({digits : digits, country :
this
.components.country}, {count : 1});
}