2013-04-08 3 views
1

У меня есть 100 миллионов записей в моей коллекции «sample». Я хочу иметь другую коллекцию со всеми различными именами пользователей «user.screen_name»Отдельные значения ключа в поддоку MongoDB (100 миллионов записей)

У меня есть следующая структура в моей базе данных MongoDB «образец» коллекция:

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

Когда я пытаюсь что-то вроде «отчетливый ('user.id) .length „Я получаю следующее сообщение об ошибке:

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

Мне нужна эффективного способ иметь другую коллекцию только {„user_name“:„имя“} различных пользователей в моем“ сбор образцов. поэтому я могу запросить размер этой новой базы данных и получить количество отдельных пользователей. (и для дальнейшего анализа в будущем)

+0

Вы помечено это с MapReduce, пытались ли вы использовать MapReduce MongoDB в? – WiredPrairie

+0

Не совсем, я знаю, что ответ может быть использован mapreduce, однако я не очень хорошо знаком с синтаксисом и концепцией. – amaatouq

+3

Начните с документации. Это хорошее место для начала. http://docs.mongodb.org/manual/core/map-reduce/ – WiredPrairie

ответ

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

С уважением

Смежные вопросы