Я делаю MapReduce в Mongo, чтобы сгенерировать обратный индекс токенов для некоторых документов.У меня проблемы с доступом к _id документа в функции карты.
Пример документа:
{
"_id" : ObjectId("4ea42a2c6fe22bf01f000d2d"),
"attributes" : {
"name" : "JCDR 50W38C",
"upi-tokens" : [
"50w38c",
"jcdr"
]
},
"sku" : "143669259486830515"
}
(Поле ttributes ['upi-tokens'] представляет собой список текстовых токенов, которые я хочу использоватьсоздать обратный индекс для.)
Функция карты (источник проблемы):
m = function () {
this.attributes['upi-tokens'].forEach(
function (token) { emit(token, {ids: [ this._id ]} ); }
); }
Функция уменьшения:
r = function (key, values) {
var results = new Array;
for (v in values) {
results = results.concat(v.ids);
}
return {ids:results};
}
Вызов MapReduce:
db.offers.mapReduce(m, r, { out: "outcollection" } )
ПРОБЛЕМА Результирующая коллекция имеет ноль значений везде, где я ожидаю идентификатор вместо реальных строк ObjectID.
Возможная причина:
Я ожидал, что следующие 2 функции будут эквивалентны, но это не так.
m1 = function (d) { print(d['_id']); }
m2 = function () { print(this['_id']); }
Теперь я запускаю:
db.offers.find().forEach(m1)
db.offers.find().forEach(m2)
Разница в том, что m2 печатает undefined для каждого документа, а m1 печатает идентификаторы по желанию.Понятия не имею, почему.
Вопросы:
- Как получить _id текущего объекта в функции map для использования в MapReduce?this._id или this ['_ id'] не работает.
- Почему именно m1 и m2 не эквивалентны?