이전에는 쉽게
Ottoman을 사용하여 Node.js 및 Couchbase 앱 개발하기 를 소개합니다. 이 게시물은 Ottoman이 어떤 일을 할 수 있는지, 그리고 여러분이 어떻게
는 몽구스가 몽고DB로 할 수 있는 일과 비교할 수 있습니다.
이번에는 한 걸음 더 나아가 Ottoman을 빛나게 하는 몇 가지 사용 사례를 살펴보겠습니다.
Couchbase용 Node.js SDK에는 문서 작업을 위한 다양한 방법이 있습니다. CRUD 작업, N1QL 쿼리, Couchbase 보기, 이러한
는 모두 사용하기에 좋은 기능이지만 데이터가 정말 거칠어지면 어떻게 될까요? 거친 데이터란 참조된 문서가 있는 문서를 의미합니다.
관계와 복잡한 구조가 필요합니다. 카우치베이스 뷰와 CRUD 작업을 사용할 수 있지만 관계가 복잡한 경우에는
에는 데이터 조작을 위한 많은 Node.js 코드가 있을 것입니다. N1QL 쿼리를 사용할 수도 있지만, 관계가 복잡하면 다음과 같이 됩니다.
를 사용하면 조인이 많은 복잡한 쿼리가 남게 됩니다. 어떻게 하시나요?
몇 가지 모델링 예시
다음과 같은 문서 모델로 작업한다고 가정해 보겠습니다. 이 애플리케이션이 일종의 프로젝트 관리 애플리케이션이라고 가정해 보겠습니다.
적용.
프로젝트 모델
프로젝트를 만들려면 프로젝트 자체에 대한 정보뿐만 아니라 프로젝트에 참여하는 사람에 대한 정보도 필요합니다. 프로젝트의
오스만 모델을 샘플로 사용합니다:
1 2 3 4 5 6 7 8 9 10 |
var ProjectMdl = 오스만.모델("프로젝트", { 이름: "문자열", 설명: "문자열", 소유자: { ref: "사용자" }, 사용자: [ { ref: "사용자" } ] }); |
위 모델에서 소유자
라는 다른 오스만 모델입니다. 사용자하지만 사용자
는
배열의 사용자 모델입니다.
사용자 모델
프로젝트 모델이 준비되면 Ottoman에서 사용자 모델을 정의해야 합니다. 다음과 같은 형태가 될 수 있습니다:
1 2 3 4 5 6 7 8 9 |
var UserMdl = 오스만.모델("사용자", { 이름: { 먼저: "문자열", 마지막: "문자열" }, 이메일: "문자열" }); |
위의 사용자 모델은 표준 문자열 데이터일 뿐입니다. 프로젝트 모델에서 보았던 것처럼 다른 모델에 대한 참조가 없습니다. 이제 우리는
이 두 모델을 가장 적합한 방식으로 쿼리하는 것에 대해 걱정할 필요가 없습니다.
오스만으로 심층 쿼리하기
애플리케이션 내에서 프로젝트를 쿼리하고 싶다고 가정해 보겠습니다. 이 쿼리는 일반적으로 다음과 같은 형태입니다:
1 2 3 4 5 6 7 8 |
ProjectMdl.getById("ID_HERE", 함수(오류, 프로젝트) { 만약(오류) { 반환 res.상태(400).보내기(오류); } res.보내기(프로젝트); }); |
이 쿼리의 결과는 다음과 같이 표시될 수 있습니다:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
{ 이름: "내 프로젝트", 설명: "이것은 내 프로젝트에 대한 설명입니다", 소유자: { "_유형": "user", "$ref": "1234" }, 사용자: [ { "_유형": "user", "$ref": "1234" }, { "_유형": "user", "$ref": "4321" } ] } |
무슨 문제인가요? 쿼리가 아주 적은 양의 데이터만 로드했습니다. 예를 들어 실제 사용자 정보는 로드되지 않았습니다,
해당 사용자 문서에 대한 참조만 표시합니다.
그렇다면 다른 문서에 대한 심층 쿼리는 어떻게 할 수 있을까요? 이 쿼리 수정본을 살펴보세요:
1 2 3 4 5 6 7 8 |
ProjectMdl.getById("ID_HERE", {load: ["users"]}, 함수(오류, 프로젝트) { 만약(오류) { 반환 res.상태(400).보내기(오류); } res.보내기(프로젝트); }); |
다음 사용법에 유의하세요. {load: ["users"]}
로 설정합니다. 즉, 배열의 모든 사용자 모델을 로드하고 싶다는 뜻입니다.
를 반환합니다. 소유자 문서도 로드하려면 어떻게 해야 할까요? 다음과 같이 할 수 있습니다.
{load: ["users", "owner"]}
를 클릭하여 로드할 수도 있습니다.
오스만 모델 복잡하게 만들기
이제 데이터 모델을 조금 변경해 보겠습니다. 이제 프로젝트 오스만 모델이 다음과 같이 보인다고 가정해 보겠습니다:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
var ProjectMdl = 오스만.모델("프로젝트", { 이름: "문자열", 설명: "문자열", 소유자: { ref: "사용자" }, 댓글: [ { 메시지: "문자열", 사용자: { ref: "사용자" } } ] }); |
이제 우리는 오스만 모델 배열 대신 오스만 모델을 포함하는 오브젝트 배열로 작업하고 있습니다.
심층 오스만 쿼리 변경
데이터 모델을 변경하면 쿼리도 변경됩니다. 다음과 같이 하는 것은 말이 되지 않습니다. {load: ["comments"]}
왜냐하면
댓글
는 오스만 모델이 아닙니다. 로드할 것이 없습니다. 대신 쿼리를 다음과 같이 변경해야 합니다:
1 2 3 4 5 6 7 8 |
ProjectMdl.getById("ID_HERE", {load: ["소유자", "comments[*].user"]}, 함수(오류, 프로젝트) { 만약(오류) { 반환 res.상태(400).보내기(오류); } res.보내기(프로젝트); }); |
다음 사용법에 유의하세요. comments[*].user
를 추가합니다. 위의 모든 객체 요소에 존재하는 사용자 모델을 로드하고 있습니다.
배열입니다.
결론
방금 단일 쿼리 내에서 하위 모델을 모두 로드하는 방법을 살펴보았습니다. N1QL 쿼리를 사용하면 매우 가능하지만, 이 경우 몇 가지
JOIN
문을 사용하여 작업을 완료할 수 있습니다. 선호도에 따라 다르지만 ODM 방식을 선호한다면 Ottoman
및 load
옵션을 선택하는 것이 좋습니다.
이에 대한 전체 작동 예는 다음 문서에서 확인할 수 있습니다. 규정 준수 GitHub 프로젝트 as
뿐만 아니라 웨비나 시리즈 풀 스택 개발에서 수행한 작업입니다.