MongoDB: Mapreduce: уменьшить-> несколько не поддерживается
У меня есть коллекция MongoDB (называемая "каталог" ), содержащая около 5 астрономических каталогов. Некоторые из этих каталогов ссылаются друг на друга, поэтому один из документов может выглядеть примерно так:
{ "_id" : ObjectId("4ec574a68e4e7a519166015f"), "bii" : 20.9519, "class" : 2480, "cpdname" : "CPD -21 6109", "decdeg" : -21.8417, "decpm" : 0.004, "dmname" : "-21 4299", "hdname" : "HD 145612", "lii" : 352.8556, "name" : "PPM 265262", "ppmname" : "PPM 265262", "radeg" : 243.2005, "rapm" : 0.0012, "vmag" : 9.6, "xref" : [ ] }
Я хочу использовать mapreduce, чтобы переместить в массив xref такие поля, как "hdname", "ppmname" и т.д. (затем отключить их).
Итак, я пытаюсь сделать это за раз, начиная с поля hdname. Ниже приведены карты и функции сокращения:
map = function() {
for (var hdname in this.hdname) {
emit(this._id,this.hdname);
}
}
reduce = function(key, values) {
var result = [];
for (var hdname in values) {
result.push(hdname);
}
return result;
}
Я пытаюсь выполнить следующую команду в оболочке mongo:
db.catalog.mapReduce(map, reduce,"catalog2");
К сожалению, я получаю следующую ошибку:
Thu Nov 17 15:52:17 uncaught exception: map reduce failed:{
"assertion" : "reduce -> multiple not supported yet",
"assertionCode" : 10075,
"errmsg" : "db assertion failure",
"ok" : 0
}
Очевидно, что я новичок... может ли кто-нибудь помочь?
Джейсон
Ответы
Ответ 1
В документации говорится: "В настоящее время возвращаемое значение из функции уменьшения не может быть массивом (обычно это объект или число)".
Итак, создайте объект и оберните в него массив. Удостоверьтесь также, что выходной сигнал уменьшения совпадает с типом ввода, поэтому вам нужно будет выдать аналогичное значение в операции с картой.
НО... зачем использовать Map-Reduce для этого? Если вы испускаете значение _id, то ничего не уменьшать, поскольку каждый ключ будет уникальным. Почему бы не просто перебрать коллекцию, копируя значения и обновляя каждую запись по одному?
Ответ 2
Недавно мне нужно было вернуть словарь и на мой шаг уменьшения. Решив это, сделав
return values.toString();
в моем коде редуктора. После этого я должен проанализировать результат, чтобы получить людей, но это было неважно...
Ответ 3
попытайтесь вернуть объект в функцию уменьшения
reduce = function(key, values) {
var result = [];
for (var hdname in values) {
result.push(hdname);
}
return {value:result};
}