У меня есть несколько монгольских моделей, на которых я запускаю mapreduce, и я хотел бы сохранить единые результаты в одной коллекции daily_stats
. Моя карта & сократить функции работают отлично подходит для всех 3-х моделей, но даже при выводе через collection.mapreduce(map, reduce, {:out => "daily_stats", :raw => true})
, результаты последующей карты сократить операции перезаписать предыдущие результаты, даже они не имеют перекрывающиеся ключей:Общая коллекция результатов поиска в MongoDB
{'_id': "2012-06-01", 'values': {photos: 10}}
{'_id': "2012-06-02", 'values': {photos: 10}}
значение для photos
получить выброшены, когда последующий проход возвращается:
{'_id': "2012-06-01", 'values': {comments: 1}}
{'_id': "2012-06-02", 'values': {comments: 6}}
Я попытался слияния также с collection.mapreduce(map, reduce, {:out => {:merge => "daily_stats"}, :raw => true})
, но это, кажется, не работает.
Любые идеи?
UPDATE
Карта & уменьшить функции, как это для каждой модели:
Карта:
function() {
day = Date.UTC(this.created_at.getFullYear(), this.created_at.getMonth(), this.created_at.getDate());
emit(day, {users: 1});
};
Уменьшение: функция (ключ, значение) { вар users_added_count = 0;
values.forEach(function(v) {
users_added_count += parseInt(v['users']) || 0;
});
return {users: users_added_count};
}
Вот некоторая дополнительная информация о полученной схеме:
{ "_id" : 1337040000000,
"value" : {
"apartments" : 280,
"price" : 1003653,
"photos" : 83,
"comments" : 0 }
}
Есть ли какой-либо причине вы не сделали, и/или не может запустить карту уменьшить раз и испускают один документ, а именно: emit (day, {users: 1}, {photos: 1}, {comments: 1})? – Jenna
О, я вижу. Первоначально у вас есть три отдельных коллекции: одна для пользователей, фотографий и комментариев? Я напишу пример, чтобы проиллюстрировать способ объединения данных. – Jenna
Или это документ из «результирующей схемы» вашей модели входных данных? Извините, чтобы уточнить, можете ли вы предоставить больше примеров ваших данных? – Jenna