이제 이것이 끝이 아닙니다. 끝의 시작도 아닙니다. 그러나 그것은 아마도 시작의 끝일 것입니다. - 윈스턴 처칠
데이터 업데이트는 일반적으로 끝이 아니라 워크플로우의 진행 과정입니다. 주문 후 배송, 재고 업데이트 후 배송, 반품 후 크레딧 조정 등 워크플로우를 계속 진행하기 위해서는 다음 단계의 작업이 필요합니다. 워크플로는 몇 단계로 단순할 수도 있고 수백 단계로 복잡할 수도 있습니다. 비즈니스 프로세스 관리 (BPM)은 그 자체로 하나의 산업입니다.
Couchbase 5.5 도입 저녁 서비스. 개발자는 데이터 변경 시 실행할 자바스크립트 함수를 작성할 수 있습니다. 삽입, 업데이트, 병합 및 삭제는 다음과 같이 함께 참조합니다. 돌연변이. 여러 가지 구체적인 사용 사례 문서화되었습니다. 개발하기 위해 이벤트 함수.
JSON 카우치베이스의 데이터 모델은 자바스크립트. N1QL 은 JSON용 SQL입니다. 이벤트 함수는 자바스크립트로 작성되며 N1QL이 통합되어 있습니다. 이벤트 함수를 사용하면 데이터에 즉시 액세스할 수 있는 절차적 비즈니스 로직을 쉽게 작성할 수 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
// 간단한 계산 기능 // 여행 샘플을 업데이트할 때마다 각 유형의 총 문서 수를 추적하세요. 함수 온업데이트(doc, 메타) { 시도 { // SELECT 문을 실행하여 카운트를 가져옵니다. var ginfo = 선택 유형, COUNT(유형) 유형 수 FROM `여행-샘플` 어디 `유형` IS NOT 누락 그룹 BY 유형; // 결과 집합을 반복합니다. 에 대한 (var val 의 ginfo) { var ckey = "trcount" + val.유형; // 문서 키 문자열을 만듭니다. var vtype = val.유형; var vtc = val.유형 수; // 유형, 카운트 가져오기 // 업데이트를 수행합니다. 업데이트 T1 사용 키[$ckey] SET 유형 = $vtype, 유형 수 =$vtc; } } catch(e) { 로그(e); } } |
다음은 개발자의 관점에서 본 함수의 수명 주기입니다. 모든 변이에 대해 실행할 함수를 원하는 수만큼 정의할 수 있습니다. 변이 수에 따라 함수의 실행 시간을 조정하는 것은 개발자의 책임입니다.
이벤트 함수의 라이프사이클은 다음과 같습니다:
모든 삽입, 업데이트 또는 삭제(직접 또는 만료)에 대해 하나 이상의 자바스크립트 함수를 실행할 수 있습니다. 이러한 함수는 새 데이터와 작업 유형을 읽은 다음 후속 작업을 실행할 수 있습니다. 이 기능은 Couchbase 블로그 및 문서에 잘 설명되어 있습니다.
문 유형 | 이벤트 함수 호출 |
선택 | 없음 |
삽입 | OnUpdate(). 함수가 호출됩니다. 삽입된 문서당 한 번만 입력합니다. 단순 삽입은 단일 문서를 삽입합니다. 삽입은 VALUES 절에 여러 문서를 사용하여 여러 문서를 포함하거나 INSERT INTO...SELECT 문을 통해 여러 문서를 삽입할 수 있습니다. |
업데이트 | OnUpdate()가 호출됩니다. 동일한 문서에 대한 여러 업데이트가 단일 업데이트로 중복 제거되는 경우를 제외하고는 업데이트된 문서당 한 번만 가능합니다. 업데이트 문은 여러 문서를 업데이트할 수 있습니다. |
UPSERT | OnUpdate(). 동작은 INSERT와 유사합니다. |
삭제 | OnDelete(). 문서가 삭제될 때마다 한 번씩 호출됩니다. |
MERGE | 삽입, 업데이트 및 삭제 작업에 따라 OnUpdate() 및/또는 OnDelete()를 호출합니다. |
색인 생성, 색인 삭제, 설명, 준비, 승인, 취소 | 이벤트 함수가 호출되지 않습니다. |
실행 | 실행되는 문 유형에 따라 다릅니다. |
이러한 함수는 N1QL 문을 실행할 수도 있습니다. 이 글의 나머지 부분에서는 이벤트 함수에서 실행되는 N1QL의 모든 측면을 살펴봅니다.
이벤트 함수의 N1QL 문.
성명서 | 이벤트 함수의 N1QL 문 사용 사례 |
인덱스 생성 | 스키마는 유연하기 때문에 데이터를 자주/주기적으로 검사하여 새로운 필드를 감지한 다음 색인을 생성할 수 있습니다. |
삭제 | 계단식 삭제. |
드롭 인덱스 | 인덱스 만들기 사용 사례에 대한 추론입니다. |
INFER | 구조에 대한 버킷을 주기적으로 점검합니다. 그런 다음 필요한 경우 조치를 취합니다(유효성 검사, 인덱스 생성, 데이터 모델 업데이트). |
삽입 | 참조 데이터 유지 관리(궁극적으로).
이 데이터를 참조하여 다른 문서를 업데이트합니다. 예: 새 우편 번호, 주 등의 데이터. 데이터를 2차/3차 문서로 (전체 또는 일부) 복사합니다. 트리거 후 작업과 유사합니다. |
MERGE | 보조 데이터를 동기화 상태로 유지하세요. |
선택 | 데이터를 가져오고, 주기적으로 보고서를 실행하는 등의 작업을 수행합니다.
데이터 품질, 데이터 유효성 등 다양한 사항을 확인합니다, 대상 문서 키를 알고 있는 경우 기본 제공 직접 문서 참조를 사용하세요. 예시를 참조하세요: https://docs.couchbase.com/server/5.5/eventing/eventing-examples.html |
UPSERT | 보조/보조 데이터 동기화 유지.
트리거 후 동작과 유사합니다. |
업데이트 | 보조/보조 데이터 동기화 유지.
트리거 후 동작과 유사합니다. |
예제: 예: N1QL로 몇 가지 이벤트 함수를 사용해 보겠습니다.
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 44 45 46 |
선택 메타().id, * 에서 실행 S1; [ { "S1": { "name": "Joe Smith", "zip": "94501" }, "id": "Joe::94040" }, { "S1": { "name": "존 스미스", "zip": "94040" }, "id": "John::94040" } ] 선택 메타().id, * 에서 S2; [ { "S2": { "name": "Joe Smith", "zip": "94501" }, "id": "Joe::94040" }, { "S2": { "name": "존 스미스", "zip": "94040" }, "id": "John::94040" } ] 선택 메타().id, * 에서 T1; <아니요 데이터> |
- 로깅 및 계단식 삭제를 위한 함수의 간단한 N1QL.
삭제한 모든 문서를 별도의 버킷에 저장하세요.
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 44 45 46 47 48 49 50 51 52 53 54 |
함수 온업데이트(doc, 메타) { } 함수 OnDelete(메타) { 시도 { var myid = 메타.id; //버킷에 삽입 삽입 INTO T1 가치(UUID(), {"type" : "삭제됨", "docid":$myid}); //캐스케이드 삭제 삭제 FROM S2 사용 키 [$myid]; } catch(e) { 로그(e); } } 이후 만들기 의 함수 위, 의 애플리케이션 실행 의 다음: 삭제 FROM S1 어디 zip = "94040"; // 문서 하나가 삭제되었습니다. 선택 메타().id, * 에서 S1; // 문서 하나가 방금 삭제되었습니다. 문서가 하나만 남아 있어야 합니다. [ { "S1": { "name": "Joe Smith", "zip": "94501" }, "id": "Joe::94040" } ] 선택 메타().id, * 에서 T1; // 삭제된 로그가 표시되어야 합니다. [ { "T1": { "docid": "John::94040", "type": "삭제됨" }, "id": "2dc9b33d-3cd4-422e-af9c-b0c664c4660f" } ] 선택 메타().id, * FROM S2; // 함수의 캐스케이드 삭제 효과로 인해 하나의 문서만 표시되어야 합니다. [ { "S2": { "name": "Joe Smith", "zip": "94501" }, "id": "Joe::94040" } ] |
- OnUpdate() 함수를 사용하여 집계 정보를 주기적으로 준비할 수 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
함수 온업데이트(doc, 메타) { 시도 { var stattime = 선택 마지막 업데이트 FROM T1 사용 키 ["trstattime"]; 에 대한 (var t 의 stattime) { var lt = t.마지막 업데이트; var d = new 날짜(); var n = d.getTime(); // 10분 이상마다 만약 ((n - lt) > (1000 * 60 * 10)) { 업데이트 T1 사용 키["trstattime"] SET 마지막 업데이트 = NOW_MILLIS() ; var ginfo = 선택 유형, 카운트(유형) 유형 수 FROM `여행-샘플` 어디 `유형` IS NOT 누락 그룹 BY 유형; 에 대한 (var val 의 ginfo) { var ckey = "trcount::" + val.유형; var vtype = val.유형; var vtc = val.유형 수; 업데이트 T1 사용 키[$ckey] SET 유형 = $vtype, 유형 수 = $vtc; } } } } catch(e) { 로그(e); } } |
참조:
- 카우치베이스 문서: https://docs.couchbase.com/server/5.5/eventing/eventing-overview.html
- 카우치베이스의 이벤트 관련 블로그: https://www.couchbase.com/blog/tag/eventing/