如何在MongoDB中使用map/reduce处理超过10000个唯一键进行分组?

5
我正在使用 MongoDB v1.4 和 mongodb-csharp driver,并尝试对具有超过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"));

我看到建议使用map/reduce,但是我不知道如何使用。请问有人能够解释一下如何使用map/reduce吗?
或者是否有其他方法可以避开这个限制?
谢谢。

编辑:我忘记了我的键集合中有2列,已经添加了。

2个回答

3
感谢Darin Dimitrov。
此外,如果有人对按两个字段分组的解决方案感兴趣,我会发布我的解决方案。
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
尝试以下的 `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;
}

谢谢。我意识到我的分组中有2列。我更新了问题。如何使用map/reduce实现这一点? - Magnus Johansson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接