2013-04-08 44 views
1

我的“样本”集合中有1亿条记录。我希望有另一个集合了所有不同的用户名“user.screen_name”MongoDB子文档中的密钥的不同值(1亿条记录)

的我有我的MongoDB数据库中的以下结构“样本”集:

{ 
"_id" : ObjectId("515af34297c2f607b822a54b"), 
"text" : "random text goes here", 
"user" : 
    { 
    "id" : 972863366, 
    "screen_name" : "xname", 
    "verified" : false, 
    "time_zone" : "Amsterdam", 
    } 
} 

当我尝试喜欢的东西“不同(“user.id)。长度:‘我得到以下错误:

"errmsg" : "exception: distinct too big, 16mb cap", 

我需要一个高效方式有另外一个集合,只有{‘USER_NAME’:‘名字’}不同用户在我的’样品采集。那么我可以查询这个新数据库的大小并获得不同用户的数量。 (并在未来进一步分析)

+0

您与MapReduce的标记这个,你有没有尝试使用MongoDB中的MapReduce? – WiredPrairie 2013-04-08 12:04:27

+0

不是,我知道答案可能是使用mapreduce,但是,我对语法和概念并不熟悉。 – amaatouq 2013-04-08 12:23:29

+3

从文档开始。这是一个开始的好地方。 http://docs.mongodb.org/manual/core/map-reduce/ – WiredPrairie 2013-04-08 12:38:11

回答

0

我试过解决方案,我发现here它工作得很好:) ..我会保持线程并添加我的代码,以防万一有人需要它。

var SOURCE = db.sample; 
var DEST = db.distinct; 
DEST.drop(); 
map = function() { 
    emit(this.user.screen_name , {count: 1}); 
} 

reduce = function(key, values) { 
    var count = 0; 

    values.forEach(function(v) { 
    count += v['count']; 
    }); 

    return {count: count}; 
}; 

res = SOURCE.mapReduce(map, reduce, 
    { out: 'distinct', 
    verbose: true 
    } 
    ); 

print("distinct count= " + res.counts.output); 
print("distinct count=", DEST.count()); 

问候