2010-04-08 8 views
5

Używam MongoDB v1.4 i mongodb-csharp driver i staram się grupy w magazynie danych, który ma więcej niż 10000 klucze, więc mam ten błąd:Jak korzystać z mapy/zmniejszyć, aby obsłużyć więcej niż 10000 unikalnych kluczy do grupowania w MongoDB?

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

użyciu kodu C# tak:

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")); 

Przeczytałem, że powinienem użyć mapy/zmniejszyć, ale nie wiem, jak to zrobić. Czy ktoś może rzucić trochę światła na sposób korzystania z mapy/zmniejszenia?
Czy jest jakiś inny sposób obejścia tego ograniczenia?
Dzięki.

EDYCJA: Zapomniałem, że mam 2 kolumny w mojej kolekcji kluczy, dodałem to.

Odpowiedz

1

Spróbuj wykonać następujące funkcje: 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

Dzięki. Zdałem sobie sprawę, że mam 2 kolumny w mojej grupie. Zaktualizowałem pytanie. Jak to osiągnąć, korzystając z mapy/zmniejszenia? –

3

Dzięki Darin Dimitrov.

Ponadto będę pisać moje rozwiązanie, które grupa przez dwa pola, jeśli ktoś jest zainteresowany tym, że:

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(); 
    } 
    } 
}