MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Gruppieren und zählen Sie in MongoDB

Das funktioniert einfach nicht wie geschrieben. Das Schlüsselproblem ist hier:key: {"ResultSet.Results.state": true} . ResultSet.Results ist ein Array. Wenn Sie nach ResultSet.Results.state fragen Sie implizieren eine Art von for Schleife hier durchgeführt werden. Die group Befehl ist dazu einfach nicht in der Lage.

Versuchen Sie stattdessen das folgende M/R:

map = function() {
  // Note that we emit once per result
  foreach(var i in ResultSet.Results) {
    key = this.ResultSet.Results[i];
    value = { count: 1, 
      quality: this.ResultSet.Results[i].quality,
      avg_quality: 0
    };

    emit(key, value);
  }
}

reduce = function(key, values) {
  // note that results has same fields as emitted value
  var results = { count: 0, quality: 0, avg_quality: 0 };
  foreach(var i in values){
    results.count += values[i].count;
    results.quality += values[i].quality;
    // ignore avg_quality, we don't use it
  }
  return results;
}

Sie müssen auch ein finalize schreiben für den Durchschnitt.

finalize = function(key, value) {
  if (value.count > 0)
    value.avg_quality = value.quality / value.count;

  return value;
}