이 이전 블로그 에서는 JavaScript 함수 내에서 N1QL 문을 실행하는 기본 사항을 살펴봅니다.

이제 다음으로 이동합니다...

이터레이터/처리 값

지금까지는 데이터를 반환하는 문과 함수에서 데이터를 반환하는 문은 의도적으로 피했습니다.

여기서부터 데이터 수집에 대한 탐색이 시작됩니다.

그리고 N1QL() 함수를 직접 참조하거나 트랜스파일러 매직으로 참조하면 문 핸들을 반환합니다. 핸들은 자바스크립트 객체의 형태로 제공되며, 예를 들어 연결된 이터레이터가 있습니다:

반복자를 설명하는 데 많은 시간을 할애하지 않으므로 여기서는 기본 사항만 설명하겠습니다:

  • 반복자에서 다음 값을 가져올 수 있습니다. next() 메서드를 사용합니다.
  • 그리고 완료 속성은 더 이상 가져올 문서가 없는 경우 참입니다.
  • 이터레이터의 next() 그리고 완료 멤버를 사용하여 모든 문서를 가져오는 동안 루프에서 더 읽기 쉬운 구조는 for..of 문 핸들 자체에 대한 루프입니다.
  • 모든 값을 검색할 필요는 없습니다. 언제든지 문을 삭제하려면 문의 close() 메서드를 사용할 수 있지만, 나중에 살펴보겠지만 이 작업을 전혀 수행할 필요는 없습니다.

모든 것을 종합해 보세요:
Basics of iterators in N1QL/JavaScript and Couchbase
및 해당 함수:

이 예제에서는 배열 이름이 res 에서 얻은 문서를 축적합니다. b1 반복기를 통해 q를 클릭한 다음 발신자에게 반환하는 데 사용됩니다.

몇 가지 참고 사항

일반적으로 쿼리 값이 수신되면 에 대한 루프가 일시적인 메모리 사용량에 영향을 미치므로 배열에 축적하는 대신에 사용해야 합니다.

반대로 함수에서 배열 값을 반환하면 예를 들어 문에서 함수를 선택할 수 있습니다:

이는 관계형 세계에서 접했던 테이블 함수나 컬렉션 파생 테이블을 사용할 때와 매우 유사합니다.

N1QL 세계에서는 다음과 같이 알려져 있습니다. 표현식 스캔.

물론 함수가 수행하고자 하는 모든 작업이 키 스페이스 추가 로직 없이 인라인 함수를 작성하는 것이 더 나을 수 있습니다.

다시 반복기로 돌아가자!

값 처리가 끝나면 반복기는 자동으로 닫히므로 사용자가 할 일이 없습니다.

이터레이터가 배수되지 않은 경우, 함수가 반환될 때나 나중에 살펴볼 다른 상황에서도 자동으로 닫히기 때문에 반드시 닫아야 하는 것은 아니지만 닫는 것이 좋습니다.

내부 에 대한 ... ... 루프에 다른 N1QL 문을 사용하는 것도 완벽하게 유효하며, 고려해야 할 몇 가지 사항은 이후 섹션에서 설명합니다.

처리 값

선택에 의해 반환된 값을 그냥 반환하는 것이 아니라 사용해 보겠습니다:

문서에서 필드를 추출하는 것일 뿐 특별히 복잡한 것은 없습니다.

이 함수를 실행하면 다음과 같은 결과가 나옵니다:

왜 그럴까요? 반환되지 않는 이유 f1?

실행을 통해 답을 추측할 수 있습니다:

그리고 UI에서 확인합니다:

f1 의 필드입니다. b1선택한 문서가 아니라!

어떤 것이든 원하는 대로 할 수 있습니다:

 

DML 문

다음 함수를 고려하세요:

이 기능은 다음에 새 문서를 만듭니다. b1 기존 문서에서 복사하고 이전 문서를 제거합니다.

사실 q1 그리고 q2 문이 값을 반환하지 않는다고 해도 크게 놀랄 일은 아닙니다: 나중에 살펴보겠지만 DML 문은 값을 반환할 수 있고, 더 나쁜 것은 트랜스파일러가 항상 값이 반환되는지 여부를 확인할 수 없기 때문에 N1QL() 함수는 항상 반복자를 반환합니다.

이것이 의미하는 바는 일단 N1QL() 호출이 반환되면 N1QL 문이 백그라운드에서 비동기적으로 실행될 수 있으므로 JavaScript 함수는 데이터를 가져오기 전에 다른 코드를 자유롭게 실행할 수 있습니다.

그리고 jsevaluator 는 값을 반환하지 않는 문이 즉시 연속적으로 실행되도록 강제함으로써 동작의 모호성을 제거합니다. 즉, 다음 문이 시작되기 전에 각 DML 문이 완료될 때까지 기다립니다.

반복기를 닫을 필요도 없고 반복기에 대한 작업도 필요하지 않습니다.

이는 우리가 본능적으로 기대하는 행동과 일치합니다. 기존 문서를 삭제하기 전에 기존 문서의 사본 삽입을 완료하고 싶거나 원본 문서의 사본을 모두 만들지 않을 수도 있습니다!

값을 반환하는 DML 문

아래 함수에서와 같이 N1QL DML 문을 만들어 값을 반환할 수 있습니다:

반환된 결과는 다음과 거의 동일한 방식으로 처리됩니다. 선택 문을 사용합니다.

결과를 반환하지 않는 DML 문과 가장 큰 차이점은 결과가 반환되지 않으면 문이 반환되는 즉시 모든 변경 사항이 디스크에 저장되지만, 결과가 반환되면 반복자로부터 각 개별 문서가 수집되면서 문이 진행되므로 모든 변경 사항에 대해 반환된 값을 모두 처리해야 디스크에 저장된다는 점입니다.

다시 말하지만, 이 문은 비동기적으로 실행되므로 각 개별 결과를 수집할 때 이것이 디스크에 마지막으로 수정된 결과라고 가정해서는 안 됩니다. 이미 더 많은 수정이 이루어졌을 수 있으며 관련 결과가 수집되기를 기다리며 대기 중일 뿐입니다.

결과를 반환하지 않는 DML 문과 마찬가지로 결과를 반환하는 문은 순차적으로 실행되므로 다음 문을 시작할 때까지 반복기에 대기 중인 모든 결과를 처리하지 않으면 jsevaluator가 처리되지 않은 값을 모두 버리고 현재 문을 완료합니다.

결론

N1QL을 통한 문서 처리와 데이터 조작 실행에 대해 살펴보았습니다.

다음으로 오류를 처리하는 방법을 살펴보겠습니다.

작성자

게시자 마르코 그레코, 소프트웨어 아키텍트, 카우치베이스

전생에 마르코는 이탈리아 최대 방사선 치료 기관에서 CTO, 방사선 물리학자, 소프트웨어 설계자, 시스템 관리자, DBA, 트레이너, 일반 관리자로 일했습니다. 직업과 국가를 바꾼 그는 처음에는 Informix에서, 나중에는 IBM에서 20년 이상 다양한 지원 및 개발 직책을 맡다가 마침내 과감히 Couchbase에 합류하여 N1QL에서 금을 만드는 데 도움을 주었습니다. 그는 여러 개의 특허를 보유하고 있으며 직접 오픈 소스 프로젝트를 저술하기도 했습니다.

댓글 남기기