2015-11-21 5 views
0

Данные в коллекции выглядит следующим образом:MongoDB Map-Reduce

[{ 
    _id: 0001, 
    imei:'123456', 
    apps:[{packageName:'google'},{packageName:'twitter'}] 

},{ 
    _id: 0002, 
    imei:'654321', 
    apps:[{packageName:'facebook'},{packageName:'twitter'} 
    }] 

я хотел бы вычислить PACKAGENAME и IMEI пользователя, так же, как это:

[{ 
    packageName:'facebook', 
    imeis:['123456']  
},{ 
    packageName:'google', 
    imeis:['123456','654321'] 
},{ 
    packageName:'twitter', 
    imeis:['123456','654321'] 

}] 

моя функция карта:

function(){ 
    emit(this.packageName,this.imei); 
}; 

уменьшить функции является:

function(key , values){ 
    var ret = {packageName:key,imeis:values}; 
    return ret; 
}; 

Но результат только PACKAGENAME, imeis является нулевым

может быть функция карта была неправильно, но я не знаю, как переписать его.

Я новичок в MongoDB .please дать мне несколько советов, ТНХ

ответ

0

Это лучше сделать с рамками агрегации.

Если ваше имя коллекции coll:

db.coll.aggregate([ 
    {$unwind:"$apps"}, 
    {$group:{ 
     "_id" : "$apps.packageName", 
     "imeis" : { $addToSet: "$imei" } 
    }} 
],{allowDiskUse: true} 
) 

агрегация $unwind сглаживает apps массив.

$group документы группы агрегации по packageName. Группа операторов $addToSet все imei уникальные значения в массиве.

allowDiskUse позволяет использовать временные файлы для ступеней конвейера агрегации, если использование памяти превышает лимит (100 ГБ ОЗУ). Кроме того, вы можете использовать match в качестве фильтра критериев.

+0

спасибо, очень большое спасибо, но – Merlin

+0

очень благодарен, он может работать, но если я сканю всю коллекцию, mongo покажу мне сообщение msg: 'exception: Превышено ограничение памяти для $ group, но не разрешено внешняя сортировка , Pass allowDiskUse: true для выбора. – Merlin

+0

@Merlin отредактировал мой ответ –