Карта MongoDB / Уменьшить количество первых вхождений во встроенные объекты - PullRequest
0 голосов
/ 17 февраля 2012

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

//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 Ответ

1 голос
/ 20 февраля 2012

Одним из вариантов является сохранение уникальных идентификаторов на этапе сокращения и использование финализатора для подсчета количества уникальных идентификаторов. Пожалуйста, см. здесь для примера.

Или

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

...