MongoDB: функция не определена во время Mapreduce - PullRequest
0 голосов
/ 30 ноября 2011

Я использую 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

Ответы [ 2 ]

1 голос
/ 06 апреля 2012

Вы также можете сохранить функцию на карте уменьшить область действия команды с помощью

scope: {
    getPreferredValue: function(){...}
}
0 голосов
/ 30 ноября 2011

Не обращайте внимания, я не сохранял функцию на стороне сервера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...