Как использовать карту / уменьшить для обработки более 10000 уникальных ключей для группировки в MongoDB? - PullRequest
5 голосов
/ 08 апреля 2010

Я использую MongoDB v1.4 и mongodb-csharp драйвер , и я пытаюсь сгруппировать данные в хранилище, которое имеет более 10000 ключей, поэтому я получаю эту ошибку:

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

используя код C #, например:

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

Я читал, что должен использовать карту / уменьшить, но я не могу понять, как. Кто-нибудь может пролить свет на то, как использовать карту / уменьшить?
Или есть какой-то другой способ обойти это ограничение?
Спасибо.

РЕДАКТИРОВАТЬ: я забыл, что у меня есть 2 столбца в моей коллекции ключей, добавил это.

Ответы [ 2 ]

3 голосов
/ 09 апреля 2010

Спасибо Дарину Димитрову.

Кроме того, я опубликую свое решение этой группы по двум полям, если кому-то это интересно:

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();
    }
  }
}
1 голос
/ 08 апреля 2010

Попробуйте следующие 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...