2010-04-08 17 views
5

estoy usando MongoDB v1.4 y el mongodb-csharp driver y trato de grupo en un almacén de datos que tiene más de 10.000 llaves, por lo que me sale este error:¿Cómo usar mapa/reducir para manejar más de 10000 claves únicas para agrupar en MongoDB?

assertion: group() can't handle more than 10000 unique keys

usando el código C# como esto:

Document query = new Document().Append("group", 
new Document() 
.Append("key", new Document().Append("myfieldname", true).Append("length", true)) 
.Append("$reduce", 
     new CodeWScope(
      "function(obj,prev) { prev.count++; }")) 
.Append("initial", new Document().Append("count", 0)) 
.Append("ns", "myitems")); 

He leído que debo usar map/reducir, pero no puedo entender cómo. ¿Puede alguien arrojar algo de luz sobre cómo usar map/reduce?
¿O existe alguna otra forma de evitar esta limitación?
Gracias.

EDIT: se me olvidó que tengo 2 columnas en mi recogida de llaves, que añadió.

Respuesta

1

pruebe las siguientes funciones: map/reduce

map = function() { 
    emit(this.myfieldname, 1); 
} 

reduce = function(k, vals) { 
    var sum = 0; 
    for(var i in vals) { 
     sum += vals[i]; 
    } 
    return sum; 
} 
+0

Gracias. Me di cuenta de que tengo 2 columnas en mi grupo. Actualicé la pregunta. ¿Cómo es posible lograr esto usando map/reduce? –

3

Gracias a Darin Dimitrov.

Además, voy a publicar mi solución de ese grupo por dos campos, si alguien está interesado en que:

string mapFunction = @" 
    function(){ 
    emit({ 
     fieldname:this.fieldname, 
     length:this.length 
    }, 1) 
    }"; 

string reduceFunction = 
@"function(k,vals)   
     { 
     var sum = 0; 
     for(var i in vals) { 
      sum += vals[i]; 
     } 
     return sum; 
     }"; 

IMongoCollection mrCol = db["table"]; 

using (MapReduceBuilder mrb = mrCol.MapReduceBuilder().Map(mapFunction).Reduce(reduceFunction)) 
{ 
    using (MapReduce mr = mrb.Execute()) 
    { 
    foreach (Document doc in mr.Documents) 
    { 
     // do something 
     int groupCount = Convert.ToInt32(doc["value"]); 

     string fieldName = ((Document)doc["_id"])["fieldname"].ToString(); 
    } 
    } 
} 
Cuestiones relacionadas