설문조사에서 가장 많이 받는 질문은 카우치베이스 포럼 그리고 스택 오버플로에서
버킷에서 특정 값으로 시작하는 키가 있는 모든 레코드를 삭제합니다. 즉, 특정 값을 공유하는 모든 레코드를 삭제하는 방법은 다음과 같습니다.
특정 복합 키. 간단한 해결책은 카우치베이스 뷰를 만들고 범위 쿼리를 실행하는 것입니다.
모든 Couchbase SDK로 범위 쿼리를 실행할 수 있지만, 이 특정 예제에서는 Node.js를 사용하여 수행하는 방법을 살펴보겠습니다.
전제 조건
다음을 시도하기 전에 다음을 설치 및 구성해야 합니다:
- Node.js 및 노드 패키지 관리자(NPM)가 설치되었습니다.
- Couchbase 3.0+
샘플 데이터
이 예제의 나머지 부분에서는 제가 호출할 버킷에 있는 몇 가지 샘플 문서를 사용하겠습니다. 테스트 버킷.
버킷에 있는 문서의 주요 이름은 다음과 같습니다:
- user::nraboy
- 사용자::밍겐트론
- user::blawson
- 제품::1
- 제품::2
- 제품::3
이 예제에서는 이러한 문서의 내용은 중요하지 않습니다. 중요한 것은 각 문서에 사용하기로 선택한 접두사입니다.
두 가지 문서 유형이 있습니다. 저는 다음을 사용하기로 선택했습니다. user:: 를 사용하여 사용자 문서와 제품:: 를 나타내는
제품 문서. 전체 키는 복합 키를 나타냅니다.
카우치베이스 뷰 만들기
Couchbase 버킷에는 많은 문서가 있습니다(실제로는 아니지만). 직접 키-값을 수행하는 데 필요한 모든 키를 기억하지 못할 가능성이 높습니다.
조회를 사용할 수 없습니다. 따라서 Couchbase 뷰를 만들어야 합니다.
코드를 통해 카우치베이스 뷰를 만들 수 있지만 이 특정 예제에서는 카우치베이스 대시보드를 통해 뷰를 만들겠습니다. Sign
를 클릭하고 카우치베이스 대시보드에서 조회수 탭을 클릭하고 테스트 버킷 를 만들었습니다.
새 개발 보기를 만들고 디자인 문서를 호출하도록 선택합니다. 디자인/개발 문서 보기 이름을
by_id. 기본 뷰 코드는 괜찮을 것이지만 그렇지 않은 경우를 대비하여 뷰가
팔로잉:
|
1 2 3 4 5 |
함수 (doc, 메타) { emit(메타.id, null); } |
이 보기는 모든 문서를 표시하며 키는 각 문서 ID입니다.
Node.js 애플리케이션
이 시점에서 이해하기 쉽도록 새로운 Node.js 애플리케이션을 만들어 보겠습니다.
프로젝트 준비하기
터미널(Mac/Linux) 또는 명령 프롬프트(Windows)를 사용하여 다음 명령을 실행합니다:
|
1 2 3 |
npm init |
모든 질문에 답하시면 됩니다. 그냥 NPM을 만들 수도 있습니다. package.json 파일을 처음부터 다시 작성하고
다음 콘텐츠를 추가합니다:
|
1 2 3 4 5 6 7 8 9 |
{ "name": "mass-delete-nodejs", "버전": "1.0.0", "설명": "특정 값으로 접두사가 붙은 모든 문서 삭제", "author": "Couchbase, Inc.", "라이선스": "MIT" } |
아직 끝나지 않았습니다. 이 계획을 시작하기 전에 프로젝트 종속성을 설치해야 합니다.
애플리케이션을 실행합니다. 명령 프롬프트 또는 터미널에서 다음 명령을 실행합니다:
|
1 2 3 |
npm 설치 카우치베이스 express --저장 |
이렇게 하면 Express 프레임워크와 Couchbase Node.js SDK가 설치됩니다.
중요한 코드
아직 만들지 않았다면 app.js 파일 옆에 있는 package.json 파일을 프로젝트에 추가합니다.
이 파일의 연락처는 다음과 같아야 합니다:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
var express = require("express"); var 카우치베이스 = require("couchbase"); var 앱 = express(); var 버킷 = (new 카우치베이스.클러스터("http://127.0.0.1:8091")).오픈버킷("testbucket"); var ViewQuery = 카우치베이스.ViewQuery; var 쿼리 = ViewQuery.에서('docs', 'by_id'); 쿼리.범위("user::", "user::" + "u02ad", false); 버킷.쿼리(쿼리, 함수(오류, 결과) { 만약(오류) { 반환 콘솔.로그(오류); } 콘솔.로그("발견됨 " + 결과.길이 + "삭제할 문서"); 에 대한(i in 결과) { 버킷.제거(결과[i].id, 함수(오류, 결과) { 콘솔.로그("삭제 " + 결과[i].키); }); } }); var 서버 = 앱.듣기(3000, 함수 () { 콘솔.로그("포트 %s에서 수신 중...", 서버.주소().포트); }); |
여기에는 많은 일이 일어나고 있으므로 세분화하여 설명하겠습니다.
|
1 2 3 4 5 |
var express = require("express"); var 카우치베이스 = require("couchbase"); var 앱 = express(); |
위의 내용은 크게 신경 쓸 것이 없습니다. 애플리케이션에서 사용할 수 있도록 Couchbase SDK와 Express 프레임워크만 포함하고 있습니다. 그러나 아래
를 클릭하면 클러스터에 연결하고 특정 버킷을 여는 것을 볼 수 있습니다:
|
1 2 3 |
var 버킷 = (new 카우치베이스.클러스터("http://127.0.0.1:8091")).오픈버킷("testbucket"); |
로컬로 호스팅되는 Couchbase 인스턴스에 연결하고 다음을 열고 있습니다. 테스트 버킷 앞서 언급했습니다.
이제 멋진 것을 보러 가겠습니다!
|
1 2 3 4 5 6 |
var ViewQuery = 카우치베이스.ViewQuery; var 쿼리 = ViewQuery.에서('docs', 'by_id'); 쿼리.범위("user::", "user::" + "u02ad", false); |
에서 ViewQuery 객체를 준비하고 있습니다. 디자인/개발 문서 디자인 문서와 by_id 보기. 보기만 쿼리하려면
특정 문서에 대해 범위 쿼리라는 것을 사용하겠습니다. 우리는 이미 뷰가 문서에
문서 ID를 키 값으로 지정합니다. 즉, 범위 쿼리를 사용하면 어떤 키를 받을지 결정할 수 있습니다.
범위 쿼리에서 시작 키는 다음과 같습니다. user:: 를 누르면 모든 사용자 문서를 삭제할 수 있습니다. 종료 키는 또한
포함 user::를 사용하되 유니코드 문자 u02ad 를 추가합니다. 이렇게 하면 모든 것이 캡처됩니다.
앞에 찾고자 하는 내용을 추가합니다. 이러한 유형의 범위 쿼리에 대한 자세한 내용은
공식 카우치베이스 문서.
마지막으로 이 쿼리를 실행하고 결과를 캡처합니다. 결과가 반복되고 다음과 같이 모든 레코드가 하나씩 삭제됩니다.
에서 확인할 수 있습니다:
|
1 2 3 4 5 6 7 |
에 대한(i in 결과) { 버킷.제거(결과[i].id, 함수(오류, 결과) { 콘솔.로그("삭제 " + 결과[i].키); }); } |
Node.js에서 실행되는 모든 삭제는 비차단 방식이므로 애플리케이션 계층이 잠기지 않습니다. 삭제 요청이 카우치베이스 서버에 도달하면,
문서가 삭제되도록 표시된 후 나중에 압축이 발생하면 삭제됩니다.
|
1 2 3 |
노드 앱.js |
위의 코드를 실행하여 이 프로젝트가 실제로 작동하는지 확인하세요.
결론
범위 쿼리를 사용하면 뷰에서 특정 문서를 쿼리한 다음 해당 문서를 삭제하도록 선택할 수 있습니다. 이 예의 특정 문서
앞에 접두사가 붙은 복합 키가 있습니다. user:: 키를 입력하세요.
카우치베이스 서버 2.5와 자바 클라이언트 1.4에서도 이 작업을 수행할 수 있나요?
예, 이 개념은 거기에서도 작동해야 하며 보기는 동일해야 하지만 자바 코드는 분명히 위와 다를 것입니다.
제가 항상 사람들에게 추천하는 또 다른 옵션은 개체를 삭제해야 하는 시기와 Couchbase 클러스터에 가할 수 있는 부하량에 따라 개체를 직접 삭제하는 대신 지금부터 X일 후까지 각 개체에 임의의 TTL을 설정하는 것입니다. 그러면 클러스터의 부하가 줄어든 상태에서 TTL이 만료되면 Couchbase 클러스터가 버킷에서 개체를 삭제하는 작업을 처리합니다.