Не знаю, как создать конкретный MapReduce в CouchDB - PullRequest
1 голос
/ 30 марта 2011

В моей базе данных есть 3 типа документов:

{
param: "a",
timestamp: "t"
} (Type 1)

{
param: "b",
partof: "a"
} (Type 2)

{
param: "b",
timestamp: "x"
} (Type 3)

(я не могу изменить макет ... ;-()

Тип 1 определяет начальную метку времени, это как стартовое событие. Тип 1 связан с несколькими документами типа 3 документами типа 2.

Я хочу получить последнюю версию Type 3 (самая высокая временная метка) и соответствующий документ типа 1.

Как мне организовать мою карту / уменьшить?

Ответы [ 2 ]

0 голосов
/ 13 апреля 2011

Как сказал пользователь jhs до меня, ваши данные являются реляционными, и если вы не можете их изменить, вы можете пересмотреть с помощью CouchDB .

Под реляционным мы подразумеваем, что каждый документ «типа 1» или «типа 3» в ваших данных «знает» только о себе, а документы «типа 2» содержат знания об отношениях между документами другие типы. С CouchDB вы можете индексировать только по полям в самих документах и ​​переходить на один уровень глубже при запросе с помощью includedocs=true. Таким образом, то, что вы просили, не может быть достигнуто с помощью одного запроса CouchDB, поскольку некоторые из требуемых данных находятся на двух уровнях от запрошенного документа.

Вот решение с двумя запросами:

{
    "views": {
        "param-by-timestamp": {
            "map": "function(doc) { if (doc.timestamp) emit(doc.timestamp, [doc.timestamp, doc.param]); }",
            "reduce": "function(keys, values) { return values.reduce(function(p, c) { return c[0] > p[0] ? c : p }) }"
        },      
        "partof-by-param": {
            "map": "function(doc) { if (doc.partof) emit(doc.param, doc.partof); }"
        }       
    }   
}

Сначала вы запрашиваете его с помощью param-by-timestamp?reduce=true, чтобы получить последнюю метку времени в value[0] и соответствующий ей параметр в value[1], а затем запрашиваете снова с partof-by-param?key="<what you got in previous query>". Если вам нужно получить полные документы вместе с отметкой времени и параметром, вам придется поиграть с includedocs=true и указать правильные значения _doc.

0 голосов
/ 31 марта 2011

Легко. Для высокореляционных данных используйте реляционную базу данных.

...