Создание представления couchdb, которое возвращает массив уникальных значений из набора документов - PullRequest
2 голосов
/ 02 апреля 2011

У меня есть база данных couchdb, заполненная документами с метками времени, поэтому формат данного документа выглядит примерно так:

{ id: "uniqueid",
  year: 2011,
  month: 3,
  day: 31,
  foo: "whatever"
  bar: "something else"
}

Я хотел бы построить набор представлений таким образом, чтобы данный ключвозвращает массив значений года, месяца или дня, для которых существуют документы.Например, учитывая имя представления Days, я хотел бы, чтобы следующий URL-адрес представления

/db/_design/designdoc/_view/Days?key=[2011,3]

возвратил массив всех дней марта 2011 года, для которых существуют документы.Например, если в марте 2011 года количество документов сократилось на шесть дней, оно могло бы выглядеть следующим образом:

[1, 2, 5, 15, 27, 31]

Аналогично,

/db/_design/designdoc/_view/Months?key=2011

Если в 2011 году количество документов приходилось наАпрель, май и сентябрь могут выглядеть следующим образом:

[4, 5, 9]

И

/db/_design/designdoc/_view/Years

вернет массив лет во всей базе данных.Если документы имеют этот год и последний год, это может выглядеть следующим образом:

[2010, 2011]

Я понимаю, что трудно написать функцию сокращения, которая возвращает массив, потому что вы в конечном итоге столкнулись с ошибками уменьшения переполнения при подсчете документовувеличивается.Я знаю это, потому что я написал функцию сокращения, которая работала, но затем начала выдавать ошибки уменьшения переполнения после того, как я загрузил ее с документами.

Одно из решений, которое я рассмотрел, - это просто создание представления без сокращения, которое создает ключ массива[year, month, day], а затем с помощью параметров startkey и endkey в представлении для возврата документов.Проблема этого подхода в том, как он масштабируется.Скажем, в моей базе данных тысячи документов за два года.Используя это представление, мне нужно пройтись по всему набору документов, просто чтобы обнаружить это.

Я считаю, этот вопрос пытается задать то же самое, хотя я не совсем уверен, поэтому яЯ решил добавить новый вопрос.Кроме того, ответы на этот вопрос не позволяют избежать ошибок переполнения для больших наборов документов, насколько я могу судить по моим ограниченным навыкам письма.

Ответы [ 2 ]

1 голос
/ 02 апреля 2011

Я думаю, для этого вам нужно построить ваши представления не только с картами, но и с , уменьшает .

0 голосов
/ 17 августа 2012

Независимо от возможных проблем масштабирования, есть 2 решения.Я буду принимать во внимание только дни, так как ответ на месяцы и годы одинаков.

Решение 1:

просмотр Дни:

карта:

function(doc) {
    if (doc.year && doc. month && doc.day) {
        emit([ year, month, day ], 1);
    }
}

уменьшить:

function(keys, values) {
    return sum(values);
}

список listDays:

function(head, req) {
    start({
        "headers": {
            "Content-Type": "text/plain"
        }
    });
    var row;
    var days = new Array();
    while(row = getRow()) {
        days.push(row.key[2]);
    }
    var daysString = json.join(',');
    send('[' + daysString + ']');
}

http call:

http://couch/db/_design/db/_list/listDays/Days?group=true&group_level=2&startkey=["2011","3"]&endkey=["2011","3Z"]

Решение 2:

просмотр Дни:

карта:

function(doc) {
    if (doc.year && doc. month && doc.day) {
        emit([ year, month, day ], null);
    }
}

список listDays:

function(head, req) {
    start({
        "headers": {
            "Content-Type": "text/plain"
        }
    });
    var row;
    var days = new Array();
    while(row = getRow()) {
        if (days.indexOf(row.key[2] == -1) { days.push(row.key[2]); }
    }
    var daysString = json.join(',');
    send('[' + daysString + ']');
}

http call:

http://couch/db/_design/db/_list/listDays/Days?startkey=["2011","3"]&endkey=["2011","3Z"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...