0

我正在使用的数据结构由一个对象组成,该对象在 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;
}
4

1 回答 1

1

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

或者

如果你只是想统计唯一的 id 并且嵌入字段的路径是固定的,我相信你应该可以使用distinct命令,使用起来要简单得多。

于 2012-02-20T03:35:38.547 回答