2013-04-08 24 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()); 

問候