Я пытаюсь решить что-то вроде довольно простой проблемы с представлением couchDb, но я даже не приближаюсь к цели с моим набором результатов.
Вместо того, чтобы обновлять документы, я каждый раз создаю новый документ в качестве стратегии управления версиями и связываю эти документы вместе с полем контроля версий под названием ver
. Самый первый документ в цепочке версий увидит поле ver
и поле _id
, имеющие одинаковое значение. Все последующие документы в цепочке будут иметь то же поле ver
, что и предыдущие документы в цепочке, но будут иметь уникальное поле _id
. Эти документы также имеют поле createdTime
, которое позволяет мне узнать, какой документ является самым последним.
Вот мои документы:
{
"_id": "abcd-1234-efgh-9876",
"ver": "abcd-1234-efgh-9876",
"createdTime": "2020-01-12 01:15:00 PM -0600",
...
},
{
"_id": "uopa-3849-pmdi-1935",
"ver": "abcd-1234-efgh-9876",
"createdTime": "2020-02-16 02:39:00 PM -0600",
...
}
Вот моя функция карты:
function (doc) {
emit(doc.ver, doc);
}
Вот моя функция сокращения:
function(keys, values, rereduce) {
var latestVersions = {};
for (var i = 0; i < keys.length; i++) {
var found = latestVersions[keys[i][0]];
if (!found || found.createdTime < values[i].createdTime) {
latestVersions[keys[i][0]] = values[i];
}
}
return latestVersions;
}
И, наконец, вот мой желаемый вывод из представления (просто do c, который я хочу):
{
"_id": "uopa-3849-pmdi-1935",
"ver": "abcd-1234-efgh-9876",
"createdTime": "2020-02-16 02:39:00 PM -0600",
...
}
Что я здесь скучаю? Функция Reduce возвращает обе записи, а это не то, что мне нужно. Это то, что я пытаюсь достичь возможно или есть лучший способ go об этом?
Обновление
Я смог заставить это работать, когда один ключ используется для доступа к представлению, что является одним из моих вариантов использования.
function (keys, values, rereduce) {
var toReturn = values[0];
for (var i = 1; i < values.length; i++) {
if (values[i].createdTime > toReturn.createdTime) {
toReturn = values[i];
}
}
return toReturn;
}
Однако у меня есть другой вариант использования, который будет возвращать все данные в представлении. Желаемый результат там такой же, как и выше, но функция, которую я использую для одиночных клавиш, будет возвращать только один результат. Как отфильтровать несколько значений с помощью общего ключа, чтобы 1 «общий» ключ: n значений -> 1 ключ: 1 значение.