이제 이것이 끝이 아닙니다. 끝의 시작도 아닙니다. 그러나 그것은 아마도 시작의 끝일 것입니다. - 윈스턴 처칠
데이터 업데이트는 일반적으로 끝이 아니라 워크플로우의 진행 과정입니다. 주문 후 배송, 재고 업데이트 후 배송, 반품 후 크레딧 조정 등 워크플로우를 계속 진행하기 위해서는 다음 단계의 작업이 필요합니다. 워크플로는 몇 단계로 단순할 수도 있고 수백 단계로 복잡할 수도 있습니다. 비즈니스 프로세스 관리 (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 |
// Simple counting function // After every update to travel sample, keep track of the total number of documents of each type. function OnUpdate(doc, meta) { try { // Issue SELECT statement to get the counts. var ginfo = SELECT type, COUNT(type) typecount FROM `travel-sample` WHERE `type` IS NOT MISSING GROUP BY type; // loop through the resultset for (var val of ginfo) { var ckey = "trcount" + val.type; // Create the document key-string. var vtype = val.type; var vtc = val.typecount; // get the type, count // do the update. UPDATE T1 USE KEYS[$ckey] SET type = $vtype, typecount =$vtc; } } catch(e) { log(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 |
select meta().id, * from execute S1; [ { "S1": { "name": "Joe Smith", "zip": "94501" }, "id": "Joe::94040" }, { "S1": { "name": "John Smith", "zip": "94040" }, "id": "John::94040" } ] select meta().id, * from S2; [ { "S2": { "name": "Joe Smith", "zip": "94501" }, "id": "Joe::94040" }, { "S2": { "name": "John Smith", "zip": "94040" }, "id": "John::94040" } ] select meta().id, * from T1; <No data> |
- 로깅 및 계단식 삭제를 위한 함수의 간단한 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 |
function OnUpdate(doc, meta) { } function OnDelete(meta) { try { var myid = meta.id; //Insert into the bucket of INSERT INTO T1 VALUES(UUID(), {"type" : "deleted", "docid":$myid}); //Cascade delete DELETE FROM S2 USE KEYS [$myid]; } catch(e) { log(e); } } After creating the function above, the application Runs the following: DELETE FROM S1 WHERE zip = "94040"; // One document was deleted. SELECT meta().id, * from S1; // one document just got deleted. There should be only one document remaining. [ { "S1": { "name": "Joe Smith", "zip": "94501" }, "id": "Joe::94040" } ] SELECT meta().id, * from T1; // We should see a log of the deleted [ { "T1": { "docid": "John::94040", "type": "deleted" }, "id": "2dc9b33d-3cd4-422e-af9c-b0c664c4660f" } ] SELECT meta().id, * FROM S2; // We should only see one document due to the effect of cascade delete from the the function [ { "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 |
function OnUpdate(doc, meta) { try { var stattime = SELECT lastupdate FROM T1 USE KEYS ["trstattime"]; for (var t of stattime) { var lt = t.lastupdate; var d = new Date(); var n = d.getTime(); // Every 10 minutes or more if ((n - lt) > (1000 * 60 * 10)) { UPDATE T1 USE KEYS["trstattime"] SET lastupdate = NOW_MILLIS() ; var ginfo = SELECT type, count(type) typecount FROM `travel-sample` WHERE `type` IS NOT MISSING GROUP BY type; for (var val of ginfo) { var ckey = "trcount::" + val.type; var vtype = val.type; var vtc = val.typecount; UPDATE T1 USE KEYS[$ckey] SET type = $vtype, typecount = $vtc; } } } } catch(e) { log(e); } } |
참조:
- 카우치베이스 문서: https://docs.couchbase.com/server/5.5/eventing/eventing-overview.html
- 카우치베이스의 이벤트 관련 블로그: https://www.couchbase.com/blog/tag/eventing/
