22 Stimmen

Was ist das CouchDB Äquivalent der SQL COUNT(*) Aggregatfunktion?

Ja, ich bin ein SQL-Jockey, der in die CouchDb Map/Reduce Welt kommt. Ich dachte, ich hätte herausgefunden, wie das Äquivalent der COUNT(*) SQL Aggregator Funktion für CouchDB Datensätze mit dem folgenden:

Karte:

function(doc) {
  emit(doc.name, doc);
}

Reduzieren:

function(keys, values, rereduce){
  return values.length;
}

Ich dachte, es würde funktionieren und etwas Ähnliches zurückgeben:

"super fun C"   2
"super fun D"   2
"super fun E"   2
"super fun F"   18

... aber nicht wirklich. Wenn ich einen Datensatz hinzufüge, schwankt die Anzahl stark. Manchmal ist die Anzahl tatsächlich vermindert was sehr überraschend war. Mache ich etwas falsch? Vielleicht verstehe ich das Konzept der letztendlichen Konsistenz nicht ganz?

44voto

David Coallier Punkte 441

In Ihrer Reduktion einfach setzen:

Anzahl

Sie können auch eine Summe erhalten, indem Sie:

_sum

also grundsätzlich reduzieren: "_sum" oder reduzieren: "_count" und stellen Sie sicher, dass der Wert, den Ihre Map ausgibt, ein gültiger Integer-Wert (numerischer Wert) ist

Ver "Eingebaute Funktionen zum Reduzieren" .

28voto

Will Harris Punkte 21437

Es sieht so aus, als ob Ihre Reduzierungsergebnisse erneut reduziert werden. Das ist, reduce wird für jeden Schlüssel mehrmals aufgerufen und dann mit diesen Ergebnissen erneut aufgerufen. Sie können das mit einer reduce Funktion wie folgt:

function(keys, values, rereduce) {
  if (rereduce) {
    return sum(values);
  } else {
    return values.length;
  }
}

Alternativ können Sie auch die map so dass die Werte immer eine Anzahl von Dokumenten sind:

// map
function(doc) {
  emit(doc.name, 1);
}

// reduce
function(keys, values, rereduce) {
  return sum(values);
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X