2012-02-17 2 views
0

Структура данных, с которой я работаю, состоит из объекта, который имеет много встроенных объектов в MongoDB. Ловушка заключается в том, что объект может содержать 2 или более одного и того же встроенного объекта (они имеют одинаковый идентификатор). Используя map/reduce, я бы хотел получить подсчет совокупности, который учитывает только встроенный объект один раз внутри объекта, а не каждое отдельное событие. Любая помощь будет оценена. См примеры кода ниже:MongoDB Map/Уменьшить количество первого появления во встроенных объектах

//working map function that counts every occurance of an embedded object 
function(){ 
    if(this.embeddedObjects != undefined){ 
    this.embeddedObjects.forEach(function(e){ 
     emit(e['_id'].toString(), 1); 
    }); 
    } 
} 

//non-working map function for counting 1 occurance of an embedded object per object 
function(){ 
    if(this.embeddedObjects != undefined){ 
    var embeddedIds = new Array(); 
    this.embeddedObjects.forEach(function(e){ 
     if(embeddedIds.join(',').indexOf(e['_id'].toString()) != -1){ 
     embeddedIds.push(e['_id'].toString()); 
     emit(e['_id'].toString(), 1); 
     } 
    }); 
    } 
} 

// reduce function 
function(key,values){ 
    var count = 0; 
    values.forEach(function(v){ 
    count += v; 
    }); 
    return count; 
} 

ответ

1

Одним из вариантов является сохранение уникальных идентификаторов во время уменьшения фазы и использовать финализации для подсчета количества уникальных идентификаторов. См. Пример here.

Или

Если вы просто хотите посчитать уникальные идентификаторы и путь к вложенной области фиксируется, я считаю, вы должны быть в состоянии использовать distinct команду, которая намного проще в использовании.

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