CouchDB Просмотров: удалить дубликаты * и * упорядочить по времени - PullRequest
7 голосов
/ 28 ноября 2010

Основываясь на отличном ответе на мой предыдущий вопрос , я частично решил проблему с CouchDB.

Это привело к новому представлению .

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

Например, вот как я могу запросить это представление:

GET http://scoates-test.couchone.com/follow/_design/asset/_view/by_userid_following?endkey=[%22c988a29740241c7d20fc7974be05ec54%22]&startkey=[%22c988a29740241c7d20fc7974be05ec54%22,{}]&descending=true&limit=3

В результате чего:

HTTP 200 http://scoates-test.couchone.com/follow/_design/asset/_view/by_userid_following
http://scoates-test.couchone.com > $_.json.rows
[ { id: 'c988a29740241c7d20fc7974be067295'
  , key: 
     [ 'c988a29740241c7d20fc7974be05ec54'
     , '2010-11-26T17:00:00.000Z'
     , 'clementine'
     ]
  , value: 
     { _id: 'c988a29740241c7d20fc7974be062ee8'
     , owner: 'c988a29740241c7d20fc7974be05f67d'
     }
  }
, { id: 'c988a29740241c7d20fc7974be068278'
  , key: 
 [ 'c988a29740241c7d20fc7974be05ec54'
     , '2010-11-26T15:00:00.000Z'
     , 'durian'
     ]
  , value: 
     { _id: 'c988a29740241c7d20fc7974be065115'
     , owner: 'c988a29740241c7d20fc7974be060bb4'
     }
  }
, { id: 'c988a29740241c7d20fc7974be068026'
  , key: 
     [ 'c988a29740241c7d20fc7974be05ec54'
     , '2010-11-26T14:00:00.000Z'
     , 'clementine'
     ]
  , value: 
     { _id: 'c988a29740241c7d20fc7974be063b6d'
     , owner: 'c988a29740241c7d20fc7974be05ff71'
     }
  }
]

Как видите, "клементина" появляется дважды.

Если я изменю представление, чтобы использовать имя фрукта / актива в качестве второго ключа (вместо времени), я могу изменить глубину группировки, чтобы свернуть их, но это не решает мое требование по времени. Точно так же с вышеупомянутой настройкой я могу упорядочить по времени, но я не могу свернуть повторяющиеся имена активов в одну строку (например, 10 ресурсов на страницу).

К сожалению, это не простой вопрос для объяснения. Возможно эта расшифровка чата немного поможет.

Пожалуйста, помогите. Боюсь, что то, что мне нужно сделать, по-прежнему невозможно.

S

Ответы [ 2 ]

7 голосов
/ 29 ноября 2010

Вы можете сделать это, используя функцию списка. Вот пример для генерации действительно простого списка, содержащего все поля владельца без дубликатов. Вы можете легко изменить его, чтобы получить JSON или XML или все, что вы хотите.

Поместите его в свой документ по проектированию активов в lists.nodupes и используйте так: http://admin:123@127.0.0.1:5984/follow/_design/assets/_list/nodupes/by_userid_following_reduce?group=true

function(head, req) {
    start({
          "headers": {
          "Content-Type": "text/html"
          }
         });
    var row;
    var dupes = [];
    while(row = getRow()) {
    if (dupes.indexOf(row.key[2]) == -1) {
        dupes.push(row.key[2]);
        send(row.value[0].owner+"<br>");
    }
    } 
}
2 голосов
/ 29 ноября 2010

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

Чтобы найти самую свежую запись для каждого типа фруктов, вам нужно будет запросить один раз для каждого фрукта.

Есть несколько способов сделать это в некотором роде.

Вам понадобится представление с такими ключами, как [fruit_type, date], а затем вы можете сделать запрос следующим образом:

for fruit in fruits
  GET /db/_design/foo/_view/bar?startkey=["apples"]&limit=1&descending=true

Это даст вам последнюю запись для каждого фрукта.

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

...