2010-11-28 2 views
7

Основываясь на отличном ответе на мой previous question, я частично решил проблему, с которой я сталкиваюсь с CouchDB.CouchDB Просмотры: удалить дубликаты * и * упорядочить по времени

В результате получилось a new view.

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

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

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 активов на странице).

К сожалению, это не простой вопрос для объяснения. Может быть, this chat transcript поможет немного.

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

S

ответ

7

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

Поместите его в активы дизайн док внутри lists.nodupes и использовать так: http://admin:[email protected]: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>"); 
    } 
    } 
} 
+0

Hi. Я попробовал ваше сокращение, и я не думаю, что он решил мою проблему: http: // scoates-test.couchone.com/_utils/database.html?follow/_design/asset/_view/by_userid_following_reduce (несмотря на сокращение, я все равно получаю «банан» дважды за «c988a29740241c7d20fc7974be060bb4»). Я использовал его неправильно? – scoates 2010-11-29 14:38:38

+0

Извините, мой первый пример неправильный. Он работает только для повторяющихся значений. Для ключей вам нужно использовать списки. Я изменил пример. Надеюсь, он решает вашу проблему. – Nek 2010-11-29 19:41:15

2

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

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

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

Вы хотите вид с ключами, как [fruit_type, дата], а затем вы можете запросить так:

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

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

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

Смежные вопросы