MongoDB Map /减少嵌入对象中首次发生的次数

时间:2012-02-17 16:38:08

标签: mongodb mapreduce embedded-object

我正在使用的数据结构包含一个在MongoDB中有许多嵌入对象的对象。问题是对象可能包含2个或更多相同的嵌入对象(它们具有相同的ID)。使用map / reduce,我想获得一个聚合计数,它只在对象中计算一次嵌入对象,而不是每次出现一次。任何帮助将不胜感激。请参阅以下代码示例:

//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 个答案:

答案 0 :(得分:1)

一种选择是在缩减阶段存储唯一ID,并使用终结器计算唯一ID的数量。有关示例,请参阅here

或者

如果您只想计算唯一ID并且修复了嵌入字段的路径,我相信您应该能够使用distinct命令,这个命令更易于使用。