Суммировать два значения в одном представлении отдельно в CouchDB

Итак, предположим, что у меня есть следующие два документа в CouchDB:

{
   "_id": "197000000002",
   "_rev": "1-fbe819b01108f30d2e9e96f3fb46eff8",
   "iyear": "1970",
   "region_txt": "North America",
   "country": "130",
   "region": "1",
   "country_txt": "Mexico",
   "nkill": "1",
   "nwound": "1",

}

{
       "_id": "197000000003",
       "_rev": "1-fbe819b01108f30d2e9e96f3fb46eff8",
       "iyear": "1970",
       "region_txt": "North America",
       "country": "130",
       "region": "2",
       "country_txt": "Mexico",
       "nkill": "3",
       "nwound": "1"
    }

Я хочу суммировать все значения nkill и nwound и получить что-то вроде этого:

[1970, "Mexico","North America"]    4, 2

На данный момент я могу СУММИТЬ только одно из двух значений или оба вместе взятых, но это не то, чего я хочу.

Моя функция карты теперь выглядит следующим образом:

function(doc) {
    if(doc.nkill >= 1) {
        emit([doc.iyear,doc.country_txt,doc.region_txt],parseInt(doc.nkill));
    }
}

И я использую _sum для функции сокращения.

Это возвращает мне ключ и значение, подобное этому:

[1970, "Mexico", "North America"]   4

person Solaiman    schedule 28.11.2018    source источник


Ответы (1)


Используйте пользовательскую функцию reduce вместо встроенной функции _sum CouchDB.

Вы можете передать массив или объект в качестве значения функции reduce, отдельно суммировать два значения, а затем вывести новый массив/объект.

Чтобы функция reduce могла потреблять объект (например), функцию map следует изменить на что-то вроде:

function(doc) {
    if(doc.nkill >= 1) {
        emit([doc.iyear,doc.country_txt,doc.region_txt],
            {nkill: parseInt(doc.nkill), nwound: parseInt(doc.nwound));
    }
}

Другой способ

После просмотра документов CouchDB выяснилось, что сильный предпочтение состоит в том, чтобы возвращать скалярные значения из функции reduce - или массив. Этот вопрос SO охватывает ваш вариант использования: как отдельно суммировать два разных значения из одного запроса.

person tephyr    schedule 03.12.2018
comment
спасибо за ваш ответ, я попробовал функцию карты. Это возвращает мне два значения. Но теперь у меня есть повторяющиеся значения, и со значениями _sum я мог бы, по крайней мере, суммировать их вместе и сгруппировать. Теперь я не знаю, как я могу сделать то же самое с двумя значениями. Вы хоть представляете, что мне нужно использовать в опции уменьшения? - person Solaiman; 03.12.2018
comment
Смотрите мое обновление - был еще один вопрос SO, который, похоже, касается вашего варианта использования. - person tephyr; 04.12.2018