2010-11-28 3 views
7

previous question에 대한 훌륭한 답을 토대로 CouchDB에서 내가 겪고있는 문제를 부분적으로 해결했습니다.CouchDB Views : 중복 된 * 및 * 시간순으로 정리하십시오.

이 결과는 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

안녕하세요. 나는 당신의 감축을 시도했고, 나는 그것이 내 문제를 해결했다고 생각하지 않는다 : http : // scoates-test.couchone.com/_utils/database.html?follow/_design/asset/_view/by_userid_following_reduce (줄이기에도 불구하고 "c988a29740241c7d20fc7974be060bb4"에 대해 두 번 "바나나"가 표시됨). 잘못 구현 했습니까? – scoates

+0

죄송합니다. 첫 번째 예가 잘못되었습니다. 중복 된 값에 대해서만 작동합니다. 키의 경우 목록을 사용해야합니다. 예제를 변경했습니다. 그것이 당신의 문제를 해결하기를 바랍니다. – Nek

+0

와우. 나는이 _list 함수가 존재하는지 전혀 몰랐다. 나는 이것을 시도하고 다시 돌아와서 그것이 나의 필요를 충족 시킨다면 받아 들일 것이다. (그러나 그것은이 시점에서 그 것처럼 보인다.) 감사! – scoates

2

주문 하나 개의 필드에 의해 다른에 uniquing하는 기본지도 할 수있는 줄일 수있는 것이 아닙니다. 데이터를 정렬하고 동적 키 범위에 축소 롤업을 적용하면됩니다.

과일의 각 유형에 대한 최신 항목을 찾으려면 과일당 한 번 쿼리해야합니다.

이렇게하려면 몇 가지 방법이 있습니다.

당신은 [fruit_type, 날짜]와 같은 키보기를 할 것입니다, 다음은 다음과 같이 조회 할 수 있습니다

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

이 당신에게 각 과일에 대한 최신 항목을 제공 할 것입니다.

목록 작업을 사용하여 각 과일 블록의 첫 행을 표시합니다. 이것은 각 과일에 적은 수의 항목이있는 한 충분히 효율적입니다. 과일당 항목이 많으면 에코보다 많은 데이터가 삭제되므로 대량 데이터 세트를 사용하면 멀티 쿼리 방식이 목록 방식보다 실제로 확장됩니다. 다행히도 그들은 동일한 뷰 인덱스에서 작업 할 수 있으므로 전환해야 할 때 큰 문제가되지 않습니다.

+0

두 개의 쿼리에서이 문제를 해결하는 데 필요한 결과를 합리적으로 매길 수 없다는 것입니다 . 가장 최근의 3 개의 항목이 필요하고 사과, 바나나, 바나나, 클레멘 타인이 가장 많다고 가정하면 3을 제한하면 사과, 바나나, 바나나가 생겨 두 번째 바나나를 버려야합니다. 단지 2 개의 결과. 어쩌면 나는 이해가 안될 수도 있습니다. 많은 사람들이 동일한 자산 (과일)을 가지고 있다면 잘 확장되지 않더라도 Nek의 목록 아이디어로 작업하고 내 문제를 해결할 수있는 것처럼 보입니다. 답장을 보내 주셔서 감사합니다. – scoates