서로 다른 두 데이터 소스의 데이터를 결합하거나, 같은 고객이 여러 번 구매했거나, 웹 양식에 동일한 데이터를 두 번 입력하는 등, 누구나 한 번쯤은 중복 데이터 문제에 직면하는 것 같습니다.
이 블로그 게시물에서는 다음을 사용하는 방법을 살펴봅니다. 조회수 를 사용하여 문서 간에 일치하는 필드를 찾고 중복되지 않는 문서를 유지합니다. 이 예제에서는 각 문서에 다음과 같은 세 가지 공통 사용자 지정 필드가 있다고 가정합니다. first_name, last_name, 우편_코드. 를 사용하여 루비 클라이언트 의 경우 카우치베이스 서버 및 faker 루비 젬을 사용하면 간단한 데이터 생성기 를 사용하여 일부 샘플 중복 데이터를 Couchbase에 로드합니다. Couchbase에서 Ruby를 프로그래밍 언어로 사용하려면 Ruby SDK를 다운로드해야 합니다. 여기.
실행 샘플은 다음과 같습니다:
$ 루비 ./generate.rb -help
-h, -호스트네임 호스트네임 연결할 호스트 이름(기본값: 127.0.0.1:8091)
-u, -사용자 사용자 이름 로그인할 사용자 아이디(기본값: 없음)
-p, -passwd 비밀번호 로그인할 비밀번호(기본값: 없음)
-b, -버킷 이름 연결할 버킷의 이름(기본값: 기본값)
-t, -총-기록 NUM 생성할 레코드의 총 개수(기본값: 10000)
-d, -중복 비율 NUM 각 NUM 번째 레코드는 중복됩니다(기본값: 30).
-?, -help 이 메시지 표시
$ ruby ./generate.rb -t 1000 -d 5
1000 / 1000

1단계
함수 (문서, 메타) {
emit([doc.first_name + '-' + doc.last_name + '-' + doc.postal_code], meta.id);
}
지도 함수는 두 문서가 중복되는 경우를 정의합니다. 위에 정의된 지도 함수에 따르면 이름, 성, 우편번호가 일치하면 두 문서가 중복된 것입니다. 이름, 성, 우편번호를 연결할 때 데이터의 앨리어싱을 방지하기 위해 '-'를 사용합니다.
2단계
축소 기능은 다음과 같습니다.
함수 (키, 값, 재환원) {
var res = [];
for (var i = 0; i < values.length; i++){
res = res.concat(values[i])
}
반환합니다;
} else {
반환 값을 반환합니다;
}
}
그룹화 후 메타아이디 값이 두 개 이상 있는 경우 이를 연결하여 중복 문서를 참조하는 메타아이디 목록을 가져옵니다.
3단계
값 배열에 있는 메타 아이디의 수가 2보다 크면 해당 키에 해당하는 문서가 중복된 것입니다. 위 그림에서 보듯이 id19와 id20은 중복 문서입니다.


"너무 큰 감소" 오류가 발생합니다.
축소 코드 청크를 제거하면 오류가 사라집니다. 하지만 그 축소 코드가 필요한 것 같아요...
N1QL에서 이 작업을 수행할 수 있나요? 클라이언트에서 하는 것이 더 빠를 것입니다.
예, 4.0 이상에서는 N1QL을 사용하여 비슷한 작업을 수행할 수 있습니다. 이 블로그는 원래 2.0용으로 작성되었습니다. 즉, Couchbase는 분산 시스템으로 배포되므로 N1QL 프로시저를 실행하면 클라이언트와 동일하게 작동합니다. 실제로는 기초 데이터에 대한 클라이언트입니다. 경우에 따라 데이터와 함께 쿼리 서비스를 실행하면 이점을 얻을 수 있지만, 다른 프로그램에서도 충분히 그렇게 할 수 있습니다.