Карта MongoDB / Снижение борьбы - PullRequest
1 голос
/ 23 марта 2011

При наличии такого документа:

{    "_id": { 
    "$oid": "4d88ca367d190a0aa4e27806"    },    "Rows": [ 
    { 
      "Columns": { 
        "Date": "Tue, 02 Aug 2011 00:00:00 GMT -04:00", 
        "Col2": 33 
        "Col3": 44 
      } 
    }, 
    { 
      "Columns": { 
        "Date": "Mon, 17 Oct 2011 00:00:00 GMT -04:00", 
        "Col2": 55 
        "Col3": 66 
      } 
    }    ],    "DocName": "For My Eyes Only",    "DocIdentifier": 3322445  }

и следующих функций Map / Reduce:

function() { 
  this.Rows.forEach(function(bulkcol) { 
    emit(this.DocName, { TrendValue: bulkcol.Columns.Col2 }); 
    }); 
}; 

function(key, values) { 
  var sum = 0; 
  values.forEach(function(currTrend) { 
    sum += currTrend.TrendValue; 
  }); 
  return {DocName: key, TrendValue: sum}; 
}; 

Я получаю следующий вывод:

{ 
  "_id": null, 
  "value": { 
    "DocName": null, 
    "TrendValue": 88 
  } 
} 

Почему DocName имеет значение null?

Ответы [ 2 ]

1 голос
/ 24 марта 2011

Проблема в значительной степени, как указал Srdjan, - внутри вашей функции forEach у вас нет ссылки на родительский документ.

Если вы измените свою функцию карты на эту, она будет работать:

m = function() {
   var docName = this.DocName;
   this.Rows.forEach(function(bulkcol) {
     emit(docName, { TrendValue: bulkcol.Columns.Col2 });
     });
 };

Итак, присвойте имя документа в переменной перед циклом, а затем используйте его в нем

0 голосов
/ 23 марта 2011

Если я смотрю на это правильно, и я хотел бы думать, что я, то this в функции emit не то, что вы ожидаете.

Поскольку это внутри функции, то это относится к каждой строке, а не к родительскому документу. Попробуйте это:

function() {
  this = parent;
  this.Rows.forEach(function(bulkcol) { 
  emit(parent.DocName, { TrendValue: bulkcol.Columns.Col2 }); 
  }); 
}; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...