Исходя из того, что я вижу здесь, (я изменю свой ответ, если необходимо) key1
и key2
выглядят как независимые поля, поэтому вам потребуется 2 отдельных представления.
Я создал 5 простых документов в моей тестовой базе данных:
// I've left out fields like _id and _rev for the sake of simplicity
{ "key1": "somevalue" }
{ "key1": "somevalue" }
{ "key2": "anotherval" }
{ "key2": "andanother" }
{ "key2": "andanother" }
Вот 2 запроса на просмотр, которые вам понадобятся:
// view for key1
function(doc) {
if (doc.key1) {
emit("key1", doc.key1);
}
}
// view for key2
function(doc) {
if (doc.key2) {
emit("key2", doc.key2);
}
}
Оттуда ваша функция Reduce может возвращать все значения в массиве, просто делая это:
function (key, values) {
return values;
}
Однако вы специально упомянули различных значений. Поскольку в JavaScript нет собственного метода unique()
для массивов, и мы не можем использовать модули CommonJS в функциях представления, для этого нам придется добавить собственную логику. Я только что скопировал первую функцию array.unique()
, которую я нашел в Google, вы можете написать свою собственную, которая наверняка лучше оптимизирована.
function (key, values, rereduce) {
var o = {}, i, l = values.length, r = [];
for (i = 0; i < l; i += 1) {
o[values[i]] = values[i];
}
for (i in o) {
r.push(o[i]);
}
return r;
}
Вы будете использовать одну и ту же функцию уменьшения в обоих представлениях. Когда вы запрашиваете любое из этих представлений, по умолчанию оно также выполняет уменьшение. (Вам нужно явно передать reduce=false
, чтобы получить только результаты вашей map
функции.
Вот наборы результатов, которые вы получите, используя вышеуказанные map/reduce
запросы: (помните, что это 2 отдельных запроса)
{"rows":[
{"key":"key1", "value": ["somevalue"]}
]}
{"rows":[
{"key": "key2", "value": ["anotherval", "andanother"]}
]}