0

私が扱っているデータ構造は、MongoDB に多くのオブジェクトが埋め込まれたオブジェクトで構成されています。問題は、オブジェクトに 2 つ以上の同じ埋め込みオブジェクトが含まれている可能性があることです (それらは同じ ID を持っています)。map/reduce を使用して、埋め込みオブジェクトを 1 回の出現ごとではなく、オブジェクト内で 1 回だけカウントする集計カウントを取得したいと考えています。どんな助けでも大歓迎です。以下のコード サンプルを参照してください。

//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

1 つのオプションは、reduce フェーズ中に一意の ID を保存し、ファイナライザーを使用して一意の ID の数をカウントすることです。例については、こちらを参照してください。

または

一意の ID をカウントしたいだけで、埋め込みフィールドへのパスが固定されている場合は、distinctコマンドを使用できるはずです。これははるかに簡単に使用できます。

于 2012-02-20T03:35:38.547 に答える