전체 문서가 아닌 문서의 일부만 읽고 쓰는 것과 관련된 많은 질문이 Couchbase 포럼과 스택 오버플로에 올라오고 있습니다. 저는 이것이 어디에서 문제가 될 수 있는지 알 수 있습니다. 예를 들어, 크기가 메가바이트인 문서가 있다면 어떨까요? 이러한 대용량 문서를 애플리케이션 계층과 Couchbase Server 간에 전송하면 속도가 상당히 느려질 수 있습니다.
여기에서 Couchbase 하위 문서 API의 일부인 카우치베이스 서버 4.5가 출시되었습니다. 키를 기반으로 전체적이고 잠재적으로 큰 문서를 가져오는 대신 필요한 문서 부분만 가져올 수 있습니다. 변경 내용을 Couchbase에 다시 기록할 때도 마찬가지입니다. 예를 들어 사용자 프로필 데이터가 있는 문서가 있는데 주소만 변경해야 한다면 어떻게 해야 할까요? 그 변경 내용만 작성하는 것이 더 합리적이지 않을까요?
여기서는 Couchbase용 Node.js SDK를 사용하여 Node.js 애플리케이션에서 하위 문서 API를 사용하는 방법을 살펴보겠습니다. 시작하기 전에 한 가지 이야기를 생각해 봅시다. 소셜 미디어 데이터가 있는 사용자 프로필이 있다고 가정해 봅시다. 문서의 나머지 부분이 아닌 소셜 미디어 데이터만을 기반으로 조작을 수행하겠습니다. 예를 들어
1 2 3 4 5 6 7 8 9 |
{ 이름: "Nic", 성: "라보이", 소셜네트워킹: { 트위터: "nraboy" } } |
위의 JSON 문서는 우리가 작업하는 기본 문서가 될 것입니다.
이해하기 쉽게 하기 위해 작업할 새로운 Node.js 프로젝트를 만들어 보겠습니다. 명확성을 위해 이 새 프로젝트를 기반으로 구축하겠습니다. Node.js가 설치되어 있고 어딘가에 Couchbase Server 4.5 이상이 실행되고 있다고 가정하고 명령 프롬프트 또는 터미널에서 다음을 실행합니다:
1 2 3 4 |
npm init -y npm 설치 카우치베이스 --저장 |
위의 명령을 실행하기 전에 새 디렉터리를 만들어야 하지만 기본적으로 새 Node.js 프로젝트를 생성하고 Couchbase Node.js SDK를 설치합니다. 새 디렉토리에 app.js 파일을 로직을 저장할 디렉토리와 같은 디렉토리에 저장합니다.
앞으로는 저희는 app.js 파일을 다운로드합니다. 파일을 열고 기본 부트스트랩 코드를 추가하여 Couchbase에 연결해 보겠습니다.
1 2 3 4 5 6 |
var 카우치베이스 = require("couchbase"); var 클러스터 = new 카우치베이스.클러스터("couchbase://localhost"); var 버킷 = 클러스터.오픈버킷("default"); |
위에서는 로컬로 실행 중인 Couchbase 인스턴스에 연결하고 기본값 버킷으로 설정합니다. 필요에 따라 자유롭게 변경하세요. 이제 다음 네 가지 자바스크립트 함수를 만들어 보겠습니다:
1 2 3 4 5 6 |
var createDocument = 함수(documentId, 문서) { } var getSubDocument = 함수(documentId) { } var 업서트서브문서 = 함수(documentId) { } var getDocument = 함수(documentId, isFinished) { } |
비동기 함수 콜백의 거대한 중첩 체인을 방지하기 위해 네 개의 함수를 만들고 있습니다. 우리 프로젝트는 스크립트처럼 설계될 것이기 때문에 체인을 따라가기가 조금 어려울 수 있습니다.
각 기능에 대해 순서대로 살펴보겠습니다. 먼저 createDocument 함수를 사용하면 다음과 같이 표시됩니다:
1 2 3 4 5 6 7 8 9 10 |
var createDocument = 함수(documentId, 문서) { 버킷.업서트(documentId, 문서, (오류, 결과) => { 만약(오류) { 반환 콘솔.로그("오류: ", 오류); } getSubDocument(documentId); }); } |
위의 함수는 문서 키와 JSON 문서를 전달한다고 가정합니다. 마지막에 설명할 테니 걱정하지 마세요. 하지만 지금 일어나고 있는 일은 업서트 를 사용하여 완전한 새 문서를 만듭니다. 이 예제에서는 기본적으로 이 함수를 초기화 함수로 사용합니다. 전체 프로필 문서가 생성되면 성공하면 다음 함수를 호출합니다. 이 다음 함수는 getSubDocument 함수를 호출하면 다음과 같이 표시됩니다:
1 2 3 4 5 6 7 8 9 10 |
var getSubDocument = 함수(documentId) { 버킷.룩업인(documentId).get("소셜 네트워킹").실행((오류, 결과) => { 만약(오류) { throw 오류; } 업서트서브문서(documentId); }); } |
위의 함수는 우리가 정의한 초기 문서 키를 가져와서 문서를 가져오는 대신 조회를 수행한다고 선언합니다. 조회를 수행할 때 우리는 소셜네트워킹 프로퍼티가 있으면 이 조회를 실행합니다. 실행 결과는 여러 속성의 배열을 반환하므로 원하는 경우 둘 이상의 속성을 가져올 수 있습니다. 예를 들어, 위 결과 내용의 배열은 다음과 같습니다:
1 2 3 |
[ { id: 0, 값: { 트위터: 'nraboy' }, 경로: '소셜네트워킹' } ] |
이후 getSubDocument 함수가 성공적으로 완료되면 업서트서브문서 함수를 사용하면 전체 문서 또는 일부만 가져와도 문서의 일부를 변경할 수 있습니다.
1 2 3 4 5 6 7 8 9 10 |
var 업서트서브문서 = 함수(documentId) { 버킷.mutateIn(documentId, 0, 0).업서트("socialNetworking.website", "thepolyglotdeveloper.com", true).실행((오류, 결과) => { 만약(오류) { throw 오류; } getDocument(documentId); }); } |
여기서 명확히 하자. 우리가 mutateIn 메서드를 사용하면 먼저 문서를 가져오지 않습니다. 앞서 수행한 조회와 비슷하게 작동합니다. 키를 기반으로 변경할 문서를 카우치베이스에 알려준 다음 특정 속성을 업서트합니다. 위의 예에서는 다음과 같은 새 속성을 만들려고 합니다. 웹사이트. 중첩된 프로퍼티이므로 해당 프로퍼티의 값과 함께 전체 경로를 전달합니다. 그러면 요청을 실행할 수 있습니다.
마지막으로 남은 전체 문서를 확인하고자 합니다. 돌연변이가 성공했다고 가정하면 getDocument 함수가 호출됩니다. 다음과 같이 표시됩니다:
1 2 3 4 5 6 7 8 9 10 |
var getDocument = 함수(documentId) { 버킷.get(documentId, (오류, 결과) => { 만약(오류) { throw 오류; } 콘솔.로그(결과); }); } |
위의 함수에서 우리는 단지 표준 get 를 문서 키로 호출합니다. 마무리를 위해 첫 번째 함수를 호출한 코드를 공유하는 것이 좋을 것 같습니다. 다음과 같이 볼 수 있습니다:
1 2 3 4 5 6 7 8 9 |
createDocument("nraboy", { 이름: "Nic", 성: "라보이", 소셜네트워킹: { 트위터: "nraboy" } }); |
결론
카우치베이스 하위 문서 API는 대용량 문서로 작업할 때 매우 유용합니다. 문서에서 조각을 가져와 전송 크기를 줄일 수 있을 뿐만 아니라 조각을 작성할 수도 있습니다. Node.js용 API로 할 수 있는 작업 중 일부만 공유했습니다. 다른 예시를 보려면 이 프로젝트에서 확인할 수 있습니다. 추가 명령은 Node.js SDK에서 확인할 수 있습니다. 문서.