Я использую mapreduce для коллекции с документами 1.15M.В случае дубликатов, когда я возвращаю результат, я хочу предпочесть значения некоторых документов другим (т. Е. Значение поля в одном документе может быть более точным, чем в другом, но, опять же, может вообще не существовать).
Чтобы выбрать значение, я определяю эту функцию (аргументы расположены в порядке от наиболее предпочтительного до наименее предпочтительного):
function getPreferredValue() {
var length = arguments.length;
for (var i = 0; i < length; i++) {
if (arguments[i] != null) {
return arguments[i];
}
}
return null;
}
Моя команда mapreduce выглядит следующим образом:
db.runCommand({
mapreduce:"catalog",
query: {$or:[
{name:/^HIP/i},
{name:/^SAO/i}
]},
map:function() {
emit({dummy:this.xref}, this); // give me the whole damn object then
},
reduce:function(key, values) {
var tempObject = {hipObject: null, saoObject:null};
for (var i = 0; i < values.length; i++) {
if (values[i].name.search("/^HIP") != -1) {
var hipObject = {bii: null, lii: null, class: null, radeg: null, decdeg: null, rapm:null, decpm:null, vmag:null, parallax:null, xref:null};
hipObject.bii = values[i].bii;
hipObject.lii = values[i].lii;
hipObject.class = values[i].class;
hipObject.radeg = values[i].radeg;
hipObject.decdec = values[i].decdeg;
hipObject.rapm = values[i].rapm;
hipObject.decpm = values[i].decpm;
hipObject.vmag = values[i].vmag;
hipObject.parallax = values[i].parallax;
hipObject.xref = values[i].xref;
tempObject.hipObject = hipObject;
}
if (values[i].name.search("/^SAO") != -1) {
var saoObject = {bii: null, lii: null, class: null, radeg: null, decdeg: null, rapm:null, decpm:null, vmag:null, parallax:null, xref:null};
saoObject.bii = values[i].bii;
saoObject.lii = values[i].lii;
saoObject.class = values[i].class;
saoObject.radeg = values[i].radeg;
saoObject.decdec = values[i].decdeg;
saoObject.rapm = values[i].rapm;
saoObject.decpm = values[i].decpm;
saoObject.vmag = values[i].vmag;
saoObject.parallax = values[i].parallax;
saoObject.xref = values[i].xref;
tempObject.saoObject = saoObject;
}
}
var result = {bii: null, lii: null, class: null, radeg: null, decdeg: null, rapm:null, decpm:null, vmag:null, parallax:null, xref:null}
result.bii = getPreferredValue(tempObject.hipObject.bii, tempObject.saoObject.bii);
result.lii = getPreferredValue(tempObject.hipObject.lii, tempObject.saoObject.lii);
result.class = getPreferredValue(tempObject.hipObject.class, tempObject.saoObject.class);
result.radeg = getPreferredValue(tempObject.hipObject.radeg, tempObject.saoObject.radeg);
result.decdeg = getPreferredValue(tempObject.hipObject.decdeg, tempObject.saoObject.decdeg);
result.rapm = getPreferredValue(tempObject.hipObject.rapm, tempObject.saoObject.rapm);
result.decpm = getPreferredValue(tempObject.hipObject.decpm, tempObject.saoObject.decpm);
result.vmag = getPreferredValue(tempObject.hipObject.vmag, tempObject.saoObject.vmag);
result.parallax = getPreferredValue(tempObject.hipObject.parallax, tempObject.saoObject.parallax);
result.xref = tempObject.hipObject.xref;
return result;
},
out: {replace:"catalog2", db:"astro3"}
});
К сожалению, при попытке запустить я получаю сообщение об ошибке, что getPreferredValue не определено.
Возможно, глупая ошибка с моей стороны, но кто-нибудь может помочь?Jason