Couchbase의 고급 버킷 액세스자는 다음과 같은 기본 제공 연산자를 사용하여 고급 키-값 저장소(KV) 기능에 액세스할 수 있게 해줍니다.
기본 버킷 접근자와 핸들러에 정의된 동일한 버킷 바인딩을 활용하지만, 더 풍부한 옵션과 연산자를 사용할 수 있습니다:
- 만료 설정 또는 검색
- CAS를 통한 경쟁 조건 해결
- 경쟁이 치열한 인기 KV 항목 조작하기
참고 기본 버킷 액세서리 는 사용하기 훨씬 쉽고, API가 간단하며, 해당 고급 버킷 접근자보다 조금 더 빠릅니다.
카우치베이스 서버 6.6.1에서는 다음과 같은 고급 버킷 접근자가 추가되었습니다:
이 7가지 새로운 버킷 액세서를 사용하면 CAS를 직접 활용하여 경합을 처리하거나 문서 만료를 설정할 수 있습니다(또는 TTL)를 통해 데이터 서비스(또는 KV)의 이벤트 를 추가하고 분산 원자 카운터 연산을 수행합니다.
예를 들어, 업서트와 같은 작업을 할 때 기본 버킷 액세서리에 맹목적으로 의존하지 말고 다음과 같이 하세요. src_bkt[id_str] = 일부_문서를 사용하면 고급 액세스자를 통해 이벤트 함수의 JavaScript 기반 로직을 사용하여 서로 다른 소스에서 동시 변이가 발생한 키의 경합(또는 경합 가능성)을 해결할 수 있습니다.
-
- 문서가 존재하지 않는 경우 다음을 사용할 수 있습니다.
couchbase.insert(src_bkt, {"id: id_str}, some_doc)를 클릭하고 반환값을 확인하여 성공 여부를 확인합니다. - 문서가 있는 경우 다음을 사용할 수 있습니다.
couchbase.replace(src_bkt, {"id: id_str, "cas": current_cas}, some_doc)를 입력하고 반환값이 성공 또는 CAS 불일치인지 확인합니다.
- 문서가 존재하지 않는 경우 다음을 사용할 수 있습니다.
각 고급 버킷 접근자에 대한 JavaScript, 입력 변이, 출력 변이 및/또는 로그 메시지를 포함한 전체 예제를 보려면 다음을 참조하세요. 스크립틀릿: 고급 액세서리 핸들러 문서 예제 섹션에서 확인할 수 있습니다.
고급 GET: 결과 = couchbase.get(바인딩, 메타)
이 작업을 통해 버킷에서 메타데이터와 함께 문서를 읽고 후속 작업을 통해 CAS를 활용하거나 다음을 확인/수정할 수 있습니다. 만료_날짜.
기본 버킷 액세서리의 경우와 대조됩니다. GET 연산은 자바스크립트 바인딩이나 맵을 노출할 뿐입니다, var adoc = src_bkt[meta.id]반환 값은 메타데이터 없이 문서만 반환합니다.
다음은 고급의 예입니다. GET 작동합니다.
|
1 2 3 4 5 6 7 8 9 10 11 12 |
함수 온업데이트(doc, 메타) { 로그('입력 문서 ', doc); 로그('입력 메타', 메타); //는 같거나 다를 수 있습니다. var new_meta = {"id":"test_adv_get::1"}; var 결과 = 카우치베이스.get(src_bkt,new_meta); 만약 (결과.성공) { 로그('성공 조언: 결과',결과); } else { 로그('실패 어드. GET: ID',new_meta.id,'결과',결과); } } |
몇 가지 반환 값 예시입니다:
|
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 29 30 31 32 33 34 35 36 |
{ "doc": { "id": 1, "type": "test_adv_get" }, "meta": { "id": "test_adv_get::1", "cas": "1610034762747412480", "data_type": "json" }, "성공": true } { "doc": { "a": 1, "random": 0.09799092443129842 }, "meta": { "id": "test_adv_insert:1", "cas": "1610140272584884224", "만료_날짜": "2021-01-08T21:12:12.000Z", "data_type": "json" }, "성공": true } { "오류": { "code": 272, "name": "lcb_key_enoent", "desc": "문서 키가 서버에 존재하지 않습니다.", "key_not_found": true }, "성공": false } |
고급 삽입결과 = couchbase.insert(바인딩, 메타, 문서)
이 작업을 통해 버킷에 새 문서를 만들 수 있습니다. 지정된 키를 가진 문서가 이미 존재하면 이 작업은 실패합니다. 문서에 만료 시간(또는 TTL)을 설정할 수 있습니다.
고급 버킷 액세서와 유사한 기본 버킷 액세서 작업은 없습니다. 삽입 작업 ( src_bkt[meta.id] = adoc 는 업서트에 가깝습니다).
다음은 고급의 예입니다. 삽입 작동합니다.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
함수 온업데이트(doc, 메타) { 로그('입력 메타', 메타); 로그('입력 문서 ', doc); //는 같거나 다를 수 있습니다. var new_meta = {"id":"test_adv_insert:1"}; // 선택 사항으로 60초 후 만료 설정 // new_meta.expiry_date = 새로운 날짜(Date.now() + 60 * 1000); var new_doc = doc; new_doc.무작위 = 수학.무작위(); var 결과 = 카우치베이스.삽입(src_bkt,new_meta,new_doc); 만약 (결과.성공) { 로그('성공 어드. 삽입: 결과',결과); } else { 로그('실패 어드. 삽입: ID',new_meta.id,'결과',결과); } } |
몇 가지 반환 값 예시입니다:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
{ "meta": { "id": "test_adv_insert:1", "cas": "1610041053310025728" }, "성공": true } { "오류": { "code": 272, "name": "lcb_key_exists", "desc": "문서 키가 서버에 이미 존재합니다.", "key_already_exists": true }, "성공": false } |
고급 UPSERT결과 = couchbase.upsert(바인딩, 메타, 문서)
이 작업을 통해 버킷에 있는 기존 문서를 업데이트하거나, 없는 경우 지정된 키로 새 문서를 만들 수 있습니다. 이 작업에서는 CAS를 지정할 수 없습니다(자동 무시됨). 또한 문서에 만료 시간(또는 TTL)을 설정할 수 있습니다.
기본 버킷 액세서리의 경우와 대조됩니다. SET 버킷 바인딩 별칭을 통해 정의된 노출된 자바스크립트 맵만 사용하는 연산입니다. src_bkt[meta.id] = adoc. 기본 SET 연산에는 반환값(상태 및 메타데이터 없음)이 없으므로 CAS 값을 확인할 방법이 없습니다.
다음은 고급의 예입니다. UPSERT 작동합니다.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
함수 온업데이트(doc, 메타) { 로그('입력 메타', 메타); 로그('입력 문서 ', doc); //는 같거나 다를 수 있습니다. var new_meta = {"id":"test_adv_upsert:1"}; // CAS를 제공하면 무시됩니다. // 선택 사항으로 60초 후 만료 설정 // new_meta.expiry_date = 새로운 날짜(Date.now() + 60 * 1000); var new_doc = doc; new_doc.무작위 = 수학.무작위(); var 결과 = 카우치베이스.업서트(src_bkt,new_meta,new_doc); 만약 (결과.성공) { 로그('성공 어드. 업서트: 결과',결과); } else { 로그('실패 어드. 업서트: ID',new_meta.id,'결과',결과); } } |
반환 값 예시입니다:
|
1 2 3 4 5 6 7 |
{ "meta": { "id": "test_adv_upsert:1", "cas": "1610127444908376064" }, "성공": true } |
고급 교체결과 = couchbase.replace(바인딩, 메타, 문서)
이 작업은 버킷에 있는 기존 문서를 대체합니다. 지정된 키를 가진 문서가 존재하지 않으면 이 작업은 실패합니다. 이 작업은 작업을 진행하기 전에 전제 조건으로 일치해야 하는 CAS 값을 지정할 수 있습니다. 또한 문서에 만료 시간(또는 TTL)을 설정할 수 있습니다.
고급 버킷 액세서와 유사한 기본 버킷 액세서 작업은 없습니다. 교체 작업 ( src_bkt[meta.id] = adoc 는 업서트에 가깝습니다).
다음은 고급의 예입니다. 교체 작동합니다.
|
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 29 30 31 32 33 34 35 36 37 38 39 40 |
함수 온업데이트(doc, 메타) { 로그('입력 메타', 메타); 로그('입력 문서 ', doc); var 모드 = 3; // 1-> CA 없음, 2-> CA 불일치, 3-> 양호한 CAS // 설정, "바꾸기"할 문서가 있는지 확인하고 오류를 무시합니다. 카우치베이스.삽입(src_bkt,{"id":"test_adv_replace:10"},{"a:": 1}); var new_meta; 만약 (모드 === 1) { // CAS를 전달하지 않으면 성공합니다. new_meta = {"id":"test_adv_replace:10"}; // 선택 사항으로 60초 후 만료 설정 // new_meta.expiry_date = 새로운 날짜(Date.now() + 60 * 1000); } 만약 (모드 === 2) { // 일치하지 않는 CAS를 전달하면 실패하므로 다음을 테스트합니다. new_meta = {"id":"test_adv_replace:10", "cas":"1111111111111111111"}; } 만약 (모드 === 3) { // 일치하는 또는 현재 CAS를 전달하면 성공합니다. var tmp_r = 카우치베이스.get(src_bkt,{"id":"test_adv_replace:10"}); 만약 (tmp_r.성공) { // 여기서는 couchbase.get(...)을 통해 방금 읽은 현재 CAS를 사용합니다. new_meta = {"id":"test_adv_replace:10", "cas": tmp_r.메타.cas}; } else { 로그('존재하지 않는 키를 생성하고 다시 실행하는 키를 대체할 수 없습니다',"test_adv_replace:10"); 반환; } } var new_doc = doc; new_doc.무작위 = 수학.무작위(); var 결과 = 카우치베이스.대체(src_bkt,new_meta,new_doc); 만약 (결과.성공) { 로그('성공 어드. 교체: 결과',결과); } else { 로그('실패 조언. 교체: ID',new_meta.id,'결과',결과); } } |
몇 가지 반환 값 예시입니다:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
{ "meta": { "id": "test_adv_replace:10", "cas": "1610130177286144000" }, "성공": true } { "오류": { "code": 272, "name": "lcb_key_exists", "desc": "문서 키가 지정된 것과 다른 CAS 값으로 존재합니다.", "cas_mismatch": true }, "성공": false } |
고급 삭제결과 = couchbase.delete(바인딩, 메타)
이 작업을 통해 키로 지정된 버킷에서 문서를 삭제할 수 있습니다. 선택적으로 작업을 진행하기 위한 전제 조건으로 일치시킬 CAS 값을 지정할 수 있습니다.
기본 버킷 액세서리의 경우와 대조됩니다. DEL 연산은 단순히 노출된 자바스크립트 바인딩 또는 맵을 사용하는 연산입니다, 삭제 src_bkt[메타 아이디]반환값이 없는 경우(상태 및 메타데이터 없음).
다음은 고급의 예입니다. 삭제 작동합니다.
|
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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
함수 온업데이트(doc, 메타) { 로그('입력 메타', 메타); 로그('입력 문서 ', doc); var 모드 = 4; // 1-> CA 없음, 2-> CA 불일치, 3-> CAS 양호, 4-> 해당 키 없음 // 설정, "삭제"할 문서가 있는지 확인하고 오류를 무시합니다. 카우치베이스.삽입(src_bkt,{"id":"test_adv_delete:10"},{"a:": 1}); var new_meta; 만약 (모드 === 1) { // CAS를 전달하지 않으면 성공합니다. new_meta = {"id":"test_adv_delete:10"}; // 선택 사항으로 60초 후 만료 설정 // new_meta.expiry_date = 새로운 날짜(Date.now() + 60 * 1000); } 만약 (모드 === 2) { // 일치하지 않는 CAS를 전달하면 실패하므로 다음을 테스트합니다. new_meta = {"id":"test_adv_delete:10", "cas":"1111111111111111111"}; } 만약 (모드 === 3) { // 일치하는 또는 현재 CAS를 전달하면 성공합니다. var tmp_r = 카우치베이스.get(src_bkt,{"id":"test_adv_delete:10"}); 만약 (tmp_r.성공) { // 여기서는 couchbase.get(...)을 통해 방금 읽은 현재 CAS를 사용합니다. new_meta = {"id":"test_adv_delete:10", "cas": tmp_r.메타.cas}; } else { 로그('존재하지 않는 키를 삭제하고 다시 실행할 수 없습니다',"test_adv_delete:10"); 반환; } } 만약 (모드 === 4) { // 제거하여 다음과 같은 키가 없도록 합니다. 삭제 src_bkt["test_adv_delete:10"] new_meta = {"id":"test_adv_delete:10"}; } var 결과 = 카우치베이스.삭제(src_bkt,new_meta); 만약 (결과.성공) { 로그('성공 어드. 삭제: 결과',결과); } else { 로그('실패 어드. 삭제: ID',new_meta.id,'결과',결과); } } |
몇 가지 반환 값 예시입니다:
|
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 |
{ "meta": { "id": "key::10", "cas": "1609374065129816064" }, "성공": true } { "오류": { "code": 272, "name": "lcb_key_exists", "desc": "문서 키가 지정된 것과 다른 CAS 값으로 존재합니다.", "cas_mismatch": true }, "성공": false } { "오류": { "code": 272, "name": "lcb_key_enoent", "desc": "문서 키가 서버에 존재하지 않습니다.", "key_not_found": true }, "성공": false } |
고급 인크립션결과 = couchbase.increment(바인딩, 메타)
이 작업은 필드를 원자 단위로 증가시킵니다. 카운트 를 지정한 문서에 추가합니다. 문서의 구조는 아래와 같아야 합니다:
|
1 |
{"count": 23} // 23은 현재 카운터 값입니다. |
그리고 증분 연산은 증분 후 값을 반환합니다.
지정된 카운터 문서가 존재하지 않으면 다음을 사용하여 문서가 생성됩니다. 카운트 값을 0으로 설정하고 위에서 언급한 구조를 사용합니다. 따라서 첫 번째 반환 값은 1이 됩니다.
KV 엔진 API의 제한으로 인해 현재 이 작업은 전체 문서 카운터를 조작할 수 없습니다.
고급 버킷 액세서와 유사한 기본 버킷 액세서 작업은 없습니다. 인크립션 작동합니다.
다음은 고급의 예입니다. 인크립션 작동합니다.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
함수 온업데이트(doc, 메타) { 로그('입력 메타', 메타); 로그('입력 문서 ', doc); // doc.count가 존재하지 않으면 생성됩니다. var ctr_meta = {"id": "my_atomic_counter:1" }; var 결과 = 카우치베이스.증분(src_bkt,ctr_meta); 만약 (결과.성공) { 로그('성공 어드. 증분: 결과',결과); } else { 로그('실패 어드밴스트 증분: ID',ctr_meta.id,'결과',결과); } } |
반환 값의 예시, 다음과 같이 생성한다고 가정합니다. KEY "my_atomic_counter:1" DOC {"count": 23} 위의 이벤트 함수가 배포되면 카운트가 즉시 증가합니다:
|
1 2 3 4 5 6 7 8 9 10 |
{ "doc": { "count": 24 }, "meta": { "id": "key::1", "cas": "1609374571840471040" }, "성공": true } |
고급 선언결과 = couchbase.decrement(바인딩, 메타)
이 작업은 필드를 원자 단위로 감소시킵니다. 카운트 를 지정한 문서에 추가합니다. 문서의 구조는 아래와 같아야 합니다:
|
1 |
{"count": 23} // 23은 현재 카운터 값입니다. |
그리고 감소 연산은 감소 후 값을 반환합니다.
지정한 카운터 문서가 존재하지 않으면 카운트 값을 0으로 설정하고 위에서 언급한 구조를 사용합니다. 결과적으로 첫 번째 반환 값은 -1이 됩니다.
KV 엔진 API의 제한으로 인해 현재 이 작업은 전체 문서 카운터를 조작할 수 없습니다.
고급 버킷 액세서와 유사한 기본 버킷 액세서 작업은 없습니다. 선언 작동합니다.
다음은 고급의 예입니다. 선언 작동합니다.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
함수 온업데이트(doc, 메타) { 로그('입력 메타', 메타); 로그('입력 문서 ', doc); // doc.count가 존재하지 않으면 생성됩니다. var ctr_meta = {"id": "my_atomic_counter:1" }; var 결과 = 카우치베이스.감소(src_bkt,ctr_meta); 만약 (결과.성공) { 로그('성공 어드. 감소: 결과',결과); } else { 로그('실패 어드. 감소: ID',ctr_meta.id,'결과',결과); } } |
반환 값의 예시, 다음과 같이 생성한다고 가정합니다. KEY "my_atomic_counter:1" DOC {"count": 23} 위의 이벤트 함수가 배포되면 즉시 카운트가 감소합니다:
|
1 2 3 4 5 6 7 8 9 10 |
{ "doc": { "count": 22 }, "meta": { "id": "key::1", "cas": "1609374770297176064" }, "성공": true } |
참조