Как сказал пользователь 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
.