카우치베이스 라이트 2.0 릴리즈는 다음과 같은 다양한 기능을 제공합니다. 새로운 기능 및 개선 사항. 이러한 개선 사항 중 하나인 새로운 복제 프로토콜에 대해서는 이전 블로그에서 논의했습니다. 복제 2.0에 대한 블로그 게시물. 이 블로그 게시물에서는 또 다른 주요 기능인 Couchbase Lite 쿼리 인터페이스에 대해 소개합니다. 새로운 쿼리 인터페이스는 다음을 기반으로 합니다. N1QL는 JSON용 SQL을 확장하는 Couchbase의 선언적 쿼리 언어입니다. SQL에 익숙하다면 새로운 API의 의미를 쉽게 이해할 수 있을 것입니다.
이 글에서는 쿼리 인터페이스에 대해 소개하고 기본적인 내용을 다룹니다. 고급 쿼리 기능에 대한 다른 관련 블로그 게시물에 대한 자세한 내용은 이 글의 마지막 섹션을 참조하세요.
Couchbase Mobile 2.0 사전 릴리스 빌드는 다음에서 다운로드할 수 있습니다. 다운로드 페이지로 이동합니다.
배경
1.x 버전의 Couchbase Mobile을 사용 중이시라면 다음과 같은 내용이 익숙하실 것입니다. 맵 보기 를 사용하여 인덱스와 쿼리를 만들 수 있습니다. 2.0에서는 더 이상 뷰와 맵 함수를 만들 필요가 없습니다! 대신, 간단한 인터페이스를 통해 인덱스를 생성하고 쿼리 빌더 인터페이스를 사용해 쿼리를 구성할 수 있습니다. 새로운 쿼리 인터페이스는 사용하기 더 간단하고 훨씬 더 강력합니다. 이 글에서 몇 가지 기능을 살펴보겠습니다.
샘플 프로젝트
여기서 설명하는 예제에서는 iOS용 Swift를 사용하지만, 몇 가지 사소한 차이점을 제외하고는 Android 및 Windows 플랫폼에서도 동일한 쿼리 인터페이스가 지원된다는 점에 유의하세요. 따라서 약간의 수정만 하면 다른 플랫폼에서 작업할 때 이 글의 예제를 재사용할 수 있습니다.
샘플 Swift 프로젝트에 관심이 있다면 아래 지침을 따르세요.
- GitHub에서 iOS Swift 플레이그라운드 복제하기
1$ git 복제 https://github.com/couchbaselabs/couchbase-lite-ios-api-playground - 해당 항목의 설치 지침을 따르세요. README 파일을 사용하여 플레이그라운드를 빌드하고 실행합니다.
샘플 데이터 모델
당사는 다음 위치의 여행 샘플 데이터베이스를 사용합니다. 여기
샘플 데이터 세트에는 다음과 같이 여러 유형의 문서가 포함되어 있습니다. 유형 속성을 추가합니다. 다음과 같은 문서에 초점을 맞출 것입니다. 유형 "호텔" 그리고 "랜드마크". JSON 문서 모델은 아래와 같습니다. 단순화를 위해 아래 모델에서 일부 속성은 생략했습니다.

기본 사항
데이터베이스 열기/생성
아래의 모든 쿼리에는 데이터베이스 API를 사용하여 CouchbaseLite 데이터베이스를 열거나 생성합니다.
|
1 2 |
var 옵션 = 데이터베이스 구성() let db = 시도 데이터베이스(이름: kDBName, 구성: 옵션) |
색인
읽기 쿼리 속도를 높이려면 쿼리할 속성에 인덱스를 만들면 됩니다. 대규모 데이터 세트에서 성능 향상은 상당할 것입니다. 물론 인덱스를 저장하기 위해 필요한 스토리지가 증가하고 쓰기 성능에도 영향을 미칠 수 있다는 점에 유의하세요. 따라서 너무 많은 인덱스를 만들지 않도록 주의하세요.
다음 예제에서는 ValueIndex 에서 유형 문서의 속성
|
1 |
시도 db.createIndex(인덱스 빌더.valueIndex(항목: 값 인덱스 항목.속성("type")),withName: "typeIndex") |
다음 예제에서는 ValueIndex on 유형 그리고 이름 문서의 속성
|
1 |
시도 db.createIndex(인덱스 빌더.valueIndex(항목: 값 인덱스 항목.속성("type"),값 인덱스 항목.속성("name")),withName: "유형 이름 인덱스") |
데이터베이스에서 문서 가져오기
카우치베이스 라이트의 쿼리는 쿼리 빌더 API를 사용하여 구성됩니다.
아래 쿼리는 지정된 데이터베이스에서 모든 문서를 가져옵니다. 쿼리와 일치하는 모든 문서에 대해 문서와 관련된 모든 속성을 가져옵니다.
|
1 2 3 |
let 검색 쿼리 = 쿼리 빌더 .선택(SelectResult.모두()) .에서(데이터 소스.데이터베이스(db)) |
페이지 매김을 사용하여 데이터베이스에서 문서 가져오기
다음은 다음을 가져오는 간단한 쿼리의 구조입니다. limit 지정된 위치에서 시작하는 데이터베이스의 문서 수 오프셋. 쿼리와 일치하는 모든 문서에 대해 문서와 관련된 모든 속성을 가져옵니다.
|
1 2 3 4 |
let 검색 쿼리 = 쿼리 빌더 .선택(SelectResult.모두()) .에서(데이터 소스.데이터베이스(db)) .limit(표현식.int(limit),오프셋: 표현식.int(오프셋)) |
SelectResult를 사용하여 값 반환
A SelectResult 는 쿼리 문의 단일 반환 값을 나타냅니다. Couchbase Lite의 문서는 키-값 쌍의 사전으로 지정된 문서 속성과 관련 메타데이터로 구성됩니다. 메타데이터는 문서에 연결된 문서 Id와 시퀀스 Id로 구성됩니다. 문서를 쿼리할 때 문서 메타데이터는 기본적으로 반환되지 않습니다. 메타데이터를 명시적으로 쿼리해야 합니다.
SelectResult.all()- 문서와 관련된 모든 프로퍼티를 반환합니다.
SelectResult(표현식)- 를 기준으로 문서의 속성을 반환합니다.
표현식. 다양한 유형의 표현식에 대해서는 잠시 후에 설명합니다.
- 를 기준으로 문서의 속성을 반환합니다.
SelectResult.expression(Expression.Meta.id)- 문서 ID 반환
SelectResult.expression(Expression.Meta.sequence)- 시퀀스 ID를 반환합니다(복제에 사용됨).
쉼표로 구분된 목록을 지정할 수 있습니다. SelectResult 표현식의 선택 쿼리의 문을 작성합니다.
예를 들어 다음 select 문 쿼리는 문서 Id와 유형 그리고 이름 문서의 속성
|
1 2 3 |
선택(SelectResult.표현식(표현식.메타.id), SelectResult.표현식(표현식.속성("type")), SelectResult.표현식(표현식.속성("name"))) |
쿼리 표현식
쿼리 표현식은 쿼리 문을 구성하는 데 사용됩니다.
카우치베이스 라이트는 다음을 지원합니다. 표현식 유형.
- 속성
- 집계
- 문자열
- 데이터 정렬
- 정규식
- FTS
- 널 검사 연산자
- 산술 표현식
- 메타데이터
- 패턴 매칭
- 비교
- 컬렉션
- 기능
- 매개변수
- 정량화
- 비트 연산자
쿼리 응답 처리
쿼리 실행 결과는 배열의 모든 멤버가 쿼리를 만족하는 문서에 해당하는 Dictionary/Map인 배열입니다.
|
1 2 3 |
선택(SelectResult.표현식(표현식.메타.id), SelectResult.표현식(표현식.속성("type")), SelectResult.표현식(표현식.속성("name"))) |
- 다음을 사용하여 문서의 모든 속성을 쿼리하는 경우
SelectResult.all()를 사용하면 응답 배열의 각 멤버는 키-값 쌍으로, 데이터베이스 이름이 키이고 문서에 해당하는 사전이 키의 값입니다.예를 들어, 다음 쿼리를 고려하십시오.
|
1 2 3 4 |
let 검색 쿼리 = 쿼리 빌더 .선택(SelectResult.모두()) .에서(데이터 소스.데이터베이스(db)) .limit(표현식.int(limit),오프셋: 표현식.int(오프셋)) |
- 결과는 다음과 같이 표시됩니다("travel-sample"은 데이터베이스의 이름입니다).
12345678910111213141516171819202122232425[{"travel-sample": {"콜사인": "MILE-AIR","country": "미국","iata": "Q5","icao": "MLA","id": 10,"name": "40마일 에어","type": "항공사"}},{"travel-sample": {"콜사인": "TXW","country": "미국","iata": "TQ","icao": "TXW","id": 10123,"name": "텍사스 윙","type": "항공사"}}]
아래 코드 스니펫은 위의 결과를 처리하여 문서 객체의 세부 정보를 가져오는 방법의 예시(Swift)입니다.
12345678에 대한 행 in 시도 검색 쿼리.실행() {만약 let dict = 행.toDictionary() as? [문자열:모든],let 문서 개체 = dict["travel-sample"] as? [문자열:모든] {// 이제 문서 속성을 처리할 수 있습니다.let 이름 = 문서 개체["name"]let 유형 = 문서 개체["type"]}}
- 다음을 사용하여 문서의 ID를 쿼리하는 경우
SelectResult.expression(Expression.Meta.id)로 설정하면 응답 배열의 각 멤버는 키-값 쌍으로, 다음과 같이"id"를 키로, 문서 Id를 값으로 입력합니다.
예를 들어 다음과 같은 쿼리를 생각해 보세요.
|
1 2 3 4 |
let 검색 쿼리 = 쿼리 빌더 .선택(SelectResult.표현식(메타.id)) .에서(데이터 소스.데이터베이스(db)) .limit(표현식.int(limit)) |
- 결과는 다음과 같이 표시됩니다.
1234567891011[{"id": "airline_112"},{"id": "airline_189"},{"id": "airline_1209"}]
아래 코드 스니펫은 위의 결과를 처리하여 문서 Id를 사용하여 문서 객체의 세부 정보를 가져오는 방법의 예시(Swift)입니다.
1234567에 대한 행 in 시도 검색 쿼리.실행() {만약 let dict = 행.toDictionary() as? [문자열:모든],let docId = dict["id"] as? 문자열 {// 이제 Id를 사용하여 문서의 세부 정보를 가져올 수 있습니다.let doc = 시도 db.getDocument(docId)}} - 예를 들어 다음을 사용하여 문서의 특정 속성/속성을 쿼리하는 경우,
SelectResult.expression(Expression.property("type"))로 설정하면 응답 배열의 각 멤버는 키-값 쌍으로, 속성/속성의 이름을 키로, 해당 속성 값을 값으로 사용하는 쿼리를 예로 들어 보겠습니다.
|
1 2 3 4 |
let 검색 쿼리 = 쿼리 빌더 .선택(SelectResult.표현식(표현식.속성("type"))) .에서(데이터 소스.데이터베이스(db)) .limit(표현식.int(limit)) |
- 결과는 다음과 같이 표시됩니다.
1234567891011[{"type": "항공사"},{"type": "항공사"},{"type": "호텔"}]
아래 코드 스니펫은 위의 결과를 처리하여 쿼리한 속성 값을 가져오는 방법의 예시(Swift)입니다.
123456에 대한 행 in 시도 검색 쿼리.실행() {만약 let 문서 개체 = 행.toDictionary() as? [문자열:모든] {// 이제 속성 이름을 키로 사용하여 문서의 세부 정보를 가져올 수 있습니다.let 유형 = 문서 개체["type"]}}
쉼표로 구분된 목록을 사용하여 문서 메타데이터와 속성을 동시에 쿼리할 수 있습니다.SelectResult절을 사용하는 경우 응답 배열의 각 멤버는 앞서 설명한 대로 키-값 쌍입니다. 예를 들어, 쿼리를 고려하십시오.
12345let 검색 쿼리 = 쿼리 빌더.선택(SelectResult.표현식(메타.id),SelectResult.표현식(표현식.속성("type"))).에서(데이터 소스.데이터베이스(db)).limit(표현식.int(limit))
결과는 다음과 같이 표시됩니다.
123456789101112131415[{"id":"airline_1001","type": "항공사"},{"id":"airline_900","type": "항공사"},{"id":"hotel_1001","type": "호텔"}]
아래 코드 스니펫은 위의 결과를 처리하여 쿼리한 속성 값을 가져오는 방법의 예시(Swift)입니다.
1234567에 대한 행 in 시도 검색 쿼리.실행() {만약 let 문서 개체 = 행.toDictionary() as? [문자열:모든] {// 이제 속성 이름을 키로 사용하여 문서의 세부 정보를 가져올 수 있습니다.let 유형 = 문서 개체["type"]let docId = 문서 개체["id"]}}
Where 절 소개
SQL과 마찬가지로 어디 절을 사용하여 쿼리의 일부로 반환할 문서를 필터링할 수 있습니다. 쿼리에서 선택 문은 표현식. 원하는 수만큼 표현식 를 사용하여 정교한 필터링 기능을 구현할 수 있습니다.
특정 속성을 기준으로 문서 필터링
아래 예제에서는 속성 표현식 와 함께 입력합니다. 비교 표현식 유형을 사용하여 특정 문서 속성을 기준으로 문서를 필터링할 수 있습니다. 아래 예는 equalTo 비교 표현식입니다.
참고: 프로퍼티를 참조할 때 속성 표현식에서 키 경로(점선 표기)를 사용하여 중첩된 프로퍼티의 경로를 지정할 수 있습니다.
|
1 2 3 4 5 |
let 검색 쿼리 = 쿼리 빌더 .선택(SelectResult.모두()) .에서(데이터 소스.데이터베이스(db)) .어디(표현식.속성("type").equalTo(표현식.문자열("호텔"))) .limit(표현식.int(limit)) |
지원되는 비교 연산자 목록은 다음과 같습니다.
* 미만
* notLessThan
* lessThanOrEqualTo
* notLessThanOrEqualTo
* 더 큰보다
* notGreaterThan
* greaterThanOrEqualTo
* notGreaterThanOrEqualTo
* 같음
* notEqualTo
논리 표현식을 사용하여 문서 필터링
다음을 사용할 수 있습니다. 논리 표현식 여러 개의 비교 표현식. 아래 예제에서는 다음과 같은 문서를 가져옵니다. 유형 호텔 누구 국가 속성은 "미국" 또는 "프랑스" 그리고 누구의 공석 속성은 true. 즉, 미국 또는 프랑스에 공실이 있는 모든 호텔을 가져오는 것입니다.
|
1 2 3 4 5 6 7 8 |
let 검색 쿼리 = 쿼리 빌더 .선택(SelectResult.표현식(메타.id)) .에서(데이터 소스.데이터베이스(db)) .어디(표현식.속성("type").equalTo(표현식.문자열("호텔")) .그리고(표현식.속성("country").equalTo(표현식.문자열 ("미국")) .또는(표현식.속성("country").equalTo(표현식.문자열 ("프랑스")))) .그리고(표현식.속성("vacancy").equalTo(표현식.부울(true)))) .limit(표현식.int(limit)) |
패턴 매칭
그리고 같은 그리고 정규식 표현식을 문자열 매칭에 사용할 수 있습니다. 이러한 표현식은 대소문자를 구분하여 일치시킵니다. 따라서 문자열 일치에서 대소문자를 구분하지 않게 하려면 다음을 사용해야 합니다. Function.lower 또는 Function.upper 를 사용하여 일치하는 문자열을 소문자 또는 대문자로 변환합니다.
정확히 일치
아래 예에서는 다음과 같은 문서를 찾고 있습니다. 유형 "랜드마크" 이름 속성은 문자열과 정확히 일치합니다. "왕립 엔지니어 박물관". 이후 같은 대소문자를 구분하여 일치하는지 확인하기 위해 Function.lower 를 사용하여 일치하는 문자열을 소문자로 변환합니다. 따라서 다음 쿼리는 다음과 같이 반환됩니다. "랜드마크" 유형 문서가 포함된 이름 매칭 "왕립 엔지니어 박물관", "왕립 엔지니어 박물관", "왕립 엔지니어 박물관" 등입니다.
|
1 2 3 4 5 6 7 8 |
let 검색 쿼리 = 쿼리 빌더 .선택(SelectResult.표현식(메타.id), SelectResult.표현식(표현식.속성("country")), SelectResult.표현식(표현식.속성("name"))) .에서(데이터 소스.데이터베이스(db)) .어디(표현식.속성("type").equalTo(표현식.문자열("랜드마크")) .그리고(기능.lower(표현식.속성("name")).같은(표현식.문자열("왕립 엔지니어 박물관")))) .limit(표현식.int(limit)) |
와일드카드 경기
다음을 사용할 수 있습니다. % 기호 안에 같은 표현식을 사용하여 0개 이상의 문자에 대해 와일드카드 일치를 수행할 수 있습니다. 와일드카드를 사용하면 검색 문자열에 약간의 모호성을 부여할 수 있습니다.
아래 예에서는 다음과 같은 문서를 찾고 있습니다. 유형 "랜드마크" 이름 속성은 "eng"로 시작하여 0자 이상, 문자 "e"로 시작하여 0자 이상 오는 모든 문자열과 일치합니다. 다시 한 번, 우리는 Function.lower 를 사용하여 검색 케이스에 민감하지 않게 만들 수 있습니다.
다음 쿼리가 반환됩니다. "랜드마크" 유형 문서가 포함된 이름 매칭 "엔지니어", "엔진", "잉글리시 에그" , "잉글랜드 이글" 등입니다. 일치하는 단어가 단어 경계에 걸쳐 있을 수 있다는 점에 유의하세요.
|
1 2 3 4 5 6 7 8 |
let 검색 쿼리 = 쿼리 빌더 .선택(SelectResult.표현식(메타.id), SelectResult.표현식(표현식.속성("country")), SelectResult.표현식(표현식.속성("name"))) .에서(데이터 소스.데이터베이스(db)) .어디(표현식.속성("type").equalTo(표현식.문자열("랜드마크")) .그리고( 기능.lower(표현식.속성("name")).같은(표현식.문자열("%eng%r%")))) .limit(표현식.int(limit)) |
와일드카드 문자 매치
다음을 사용할 수 있습니다. "_" 기호 안에 같은 표현식을 사용하여 단일 캐릭터와 와일드카드 매치를 할 수 있습니다.
아래 예에서는 다음과 같은 문서를 찾고 있습니다. 유형 "랜드마크" 이름 속성은 "eng"로 시작하고 정확히 4개의 와일드카드 문자가 뒤따르고 문자 "r"로 끝나는 모든 문자열과 일치합니다.
이전 예제와 달리, 여기서는 Function.lower 를 입력하여 검색 문자열을 소문자로 변환합니다. 따라서 검색은 대소문자를 구분합니다.
다음 쿼리가 반환됩니다. "랜드마크" 유형 문서가 포함된 이름 매칭 "엔지니어", "Engineer1" 등입니다.
|
1 2 3 4 5 6 7 8 9 |
let 검색 쿼리 = 쿼리 빌더 .선택(SelectResult.표현식(메타.id), SelectResult.표현식(표현식.속성("country")), SelectResult.표현식(표현식.속성("name"))) .에서(데이터 소스.데이터베이스(db)) .어디(표현식.속성("type").equalTo(표현식.문자열("랜드마크")) .그리고( 표현식.속성("name") .같은(표현식.문자열("%Eng____r%")))) .limit(표현식.int(limit)) |
정규식 일치
그리고 정규식 표현식을 대소문자를 구분하는 일치 항목에 사용할 수 있습니다. 와일드카드와 유사 같은 표현식, 정규식 표현식 기반 패턴 일치를 사용하면 검색 문자열에 약간의 모호함이 있을 수 있습니다.
아래 예에서는 다음과 같은 문서를 찾고 있습니다. 유형 "랜드마크" 이름 속성은 "eng"로 시작하고 정확히 4개의 와일드카드 문자가 뒤따르고 문자 "r"로 끝나는 모든 문자열(단어 경계에 있는)과 일치합니다. 다시 한 번, 우리는 Function.lower 를 사용하여 검색 케이스에 민감하지 않게 만들 수 있습니다.
다음 쿼리가 반환됩니다. "랜드마크" 유형 문서가 포함된 이름 매칭 "엔진", "엔진" 등입니다. 참고 \b 는 단어 경계에서 일치 항목이 발생하도록 지정합니다.
|
1 2 3 4 5 6 7 |
let 검색 쿼리 = 쿼리 빌더 .선택(SelectResult.표현식(메타.id), SelectResult.표현식(표현식.속성("name")) ) .에서(데이터 소스.데이터베이스(db)) .어디(표현식.속성("type").equalTo(표현식.문자열("랜드마크")) .그리고(기능.lower(표현식.속성("name")).정규식(표현식.문자열("\\beng.*r.*\\b")))) .limit(표현식.int(limit)) |
무효 또는 누락된 속성이 있는 문서
SQL과 차별화되는 쿼리 언어의 특징 중 하나는 null 또는 누락된 속성이 있는 문서를 쿼리할 수 있다는 점입니다.
그리고 isNullOrMissing() 표현식은 속성 표현식 를 사용하여 지정된 프로퍼티에 null 또는 누락된 값이 있는지 테스트합니다. 프로퍼티의 isNullOrMissing() 는 그 반대입니다.
아래 예제에서는 다음과 같은 모든 문서를 찾고 있습니다. 이메일 속성이 없거나 누락되었습니다.
|
1 2 3 4 5 6 |
let 검색 쿼리 = 쿼리 빌더 .선택(SelectResult.표현식(메타.id), SelectResult.표현식(표현식.속성("이메일"))) .에서(데이터 소스.데이터베이스(db)) .어디(표현식.속성("이메일").isNullOrMissing()) .limit(표현식.int(limit)) |
문서 주문
주어진 표현식 결과를 기준으로 쿼리 결과를 정렬할 수 있습니다.
아래 예는 다음과 같은 문서를 반환합니다. 유형 와 같은 "호텔" 값에 따라 오름차순으로 정렬됩니다. title 속성입니다.
|
1 2 3 4 5 6 7 |
let 검색 쿼리 = 쿼리 빌더.선택( SelectResult.표현식(메타.id), SelectResult.표현식(표현식.속성("title"))) .에서(데이터 소스.데이터베이스(db)) .어디(표현식.속성("type").equalTo(표현식.문자열("호텔"))) .주문 기준(주문하기.속성("title").오름차순()) .limit(표현식.int(limit)) |
문자열 조작
문자열 조작 기능은 모든 데이터 처리에 필수적인 요소입니다. 이전 예제에서는 Function.lower 를 사용하여 대소문자를 구분하지 않는 문자열 비교를 위해 문자열을 소문자로 변환할 수 있습니다.
카우치베이스 라이트는 다음과 같은 문자열 처리 기능을 지원합니다.
|
1 2 3 4 5 6 7 8 |
- 기능.lower(문자열 표현식) - 기능.ltrim(문자열 표현식) - 기능.rtrim(문자열 표현식) - 기능.트림(문자열 표현식) - 기능.upper(문자열 표현식) - 기능.길이(문자열 표현식) - 기능.하위 문자열(문자열 표현식, 문자열 표현식) |
아래 예는 이메일 속성에 하위 문자열이 포함되어 있습니다. "natgeo.org". . 이름 속성 값은 응답에서 대문자로 변환됩니다.
|
1 2 3 4 5 6 |
let 검색 쿼리 = 쿼리 빌더.선택(SelectResult.표현식(메타.id), SelectResult.표현식(표현식.속성("이메일")), SelectResult.표현식(표현식.속성("name"))) .에서(데이터 소스.데이터베이스(db)) .어디(기능.포함(표현식.속성("이메일"), 하위 문자열: 표현식.문자열 ("natgeo.org"))) .limit(표현식.int(limit)) |
데이터 정렬
데이터 정렬 함수는 유니코드 문자열, 로캘 인식 문자열 조작 및 발음 부호 같은 언어별 기능을 지원하여 문자열 비교 및 정렬 기능을 향상시킵니다. 데이터 정렬에 대한 자세한 내용은 이 문서에서 확인할 수 있습니다. 글쓰기 작성자: Jens Alfke.
아래 예제에서는 대소문자 및 악센트를 무시하는 데이터 정렬 규칙을 정의합니다. 이 콜레이터는 문자열 비교 함수의 이름 속성을 검색합니다. 결과에는 다음과 같은 문서가 포함됩니다. 이름 는 "호텔 노보텔 파리 라 데팡스" , "호텔 노보텔 파리 라 데팡스" 등과 같은 문자열과 같습니다.
|
1 2 3 4 5 6 7 8 9 10 |
let 콜레이터 = 데이터 정렬.유니코드() .무시 악센트(true) .무시 케이스(true) let 검색 쿼리 = 쿼리 빌더.선택(SelectResult.표현식(메타.id), SelectResult.표현식(표현식.속성("name"))) .에서(데이터 소스.데이터베이스(db)) .어디(표현식.속성("type").equalTo(표현식.문자열("호텔")) .그리고(표현식.속성("name").collate(콜레이터).equalTo(표현식.문자열 ("호텔 노보텔 파리 라 데팡스")))) .limit(표현식.int(limit)) |
데이터 정렬 지원에는 몇 가지 제한 사항이 있습니다. 이 게시물을 작성하는 시점에서는 다음과 같은 패턴 일치 쿼리에는 사용할 수 없습니다. 같은 그리고 정규식 .
매개변수화
쿼리 인터페이스의 더 강력한 기능 중 하나는 쿼리에 매개변수를 설정할 수 있는 기능입니다. 이를 통해 쿼리를 다시 만들거나 다시 시작할 필요 없이 언제든지 쿼리에 대한 매개변수 값을 유연하게 업데이트할 수 있습니다. 쿼리 매개변수를 변경하면 쿼리가 자동으로 다시 시작되고 새 매개변수가 적용됩니다.
위의 데이터 모델을 참조하여 숫자 공개 좋아요 가 특정 범위 내에 있는지 확인합니다. 아래 예에서는 "호텔"을 찾고 있습니다. 유형 문서에서 공개 좋아요 는 5에서 10 사이입니다.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
// 1. 배열의 요소 수에 해당하는 함수 let likesCount = 배열 함수.길이(표현식.속성("public_likes")) // 2. 범위의 하한과 상한을 지정하는 매개 변수 let lowerCount = 표현식.매개변수("lower") let upperCount = 표현식.매개변수("upper") // 3. 매개 변수를 받는 쿼리 let 검색 쿼리 = 쿼리 빌더 .선택(SelectResult.표현식(메타.id), SelectResult.표현식(표현식.속성("name")), SelectResult.표현식(likesCount).as("NumLikes") ) .에서(데이터 소스.데이터베이스(db)) .어디(표현식.속성("type").equalTo(표현식.문자열 ("호텔")) .그리고(likesCount.사이(lowerCount,그리고: upperCount))) .limit(표현식.int(limit)) // 4. 쿼리 매개변수 값 제공 let 매개변수 = 매개변수.init().setInt(5, forName: "lower").setInt(10, forName: "upper") 검색 쿼리.매개변수 = 매개변수 |
위의 예제에서 다음을 사용했음을 알 수 있습니다. 배열 함수. 카우치베이스 라이트 2.0은 광범위한 배열 조작 지원을 제공합니다. 이에 대해서는 향후 이 컬렉션에 대한 블로그 게시물을 참조하세요.
다음 단계
이 블로그 게시물에서는 Couchbase Lite 2.0에서 지원되는 강력한 새 쿼리 인터페이스에 대해 살펴봤습니다. Couchbase Mobile 2.0 사전 릴리스 빌드는 다음에서 다운로드할 수 있습니다. 다운로드 페이지로 이동합니다.
다음은 관심을 가질 만한 다른 Couchbase 모바일 쿼리 관련 게시물입니다.
- 이 블로그 게시물 에서 전체 텍스트 검색 기능에 대해 설명합니다.
- 이 블로그 게시물 배열 컬렉션을 쿼리하는 방법에 대해 설명합니다.
- 이 블로그 게시물 조인 쿼리를 수행하는 방법에 대해 설명합니다.
질문이나 피드백이 있으면 아래에 댓글을 남기거나 트위터로 언제든지 문의해 주세요. @rajagp 또는 이메일을 보내주세요. priya.rajagopal@couchbase.com. . 카우치베이스 포럼 를 통해 질문할 수 있습니다.
안녕하세요,
1.3.1의 일부 기능이 보기와 같이 사라진 것 같습니다. 여기에 1.3.1에서 보기를 얻는 코드를 첨부했습니다:
var query = Provider.Db.GetView(viewName).CreateQuery();
query.AllDocsMode = AllDocsMode.AllDocs;
Couchbase.Lite 2.1.2에서 VIEW를 어떻게 찾을 수 있나요?
쿼리 빌더 인터페이스는 보다 직관적인 방법을 제공한다는 점을 제외하면 뷰와 동일한 기능을 지원합니다. SQL과 같은 형식이므로 사용하기가 더 간단합니다.
하고자 하는 작업과 그 방법에 대한 구체적인 질문이 있는 경우 다음 개발자 포럼에 구체적인 예시와 함께 게시해 주세요. http://www.couchbase.com/forums/. 그 전에 다음의 문서를 검토하는 것이 좋습니다. https://docs.couchbase.com/couchbase-lite/2.1/csharp.html. csharp에서 이를 수행하는 방법에 대한 몇 가지 예가 있습니다.
문서도 어떻게 업데이트할 수 있는지 알려주시겠어요?
모바일에서이 용량의 문서가 있는데 현재 구현에서 성능이 좋지 않습니다 (자바 스크립트 코어).
문서 크기: 600KB
라인: 27000
총 문자 수:614386
제 케이스에 대한 방향을 알려주세요. 자세한 내용은 포럼에서 계속할 수 있습니다.
예제에서 언급할 때 작은 실수가 있습니다,
이메일 속성이 0이거나 누락된 모든 문서를 찾고 있습니다.
이 경우 isNullOrMissing() 대신 notNullOrMissing() 메서드를 잘못 사용했습니다.
문서를 업데이트하세요.
수정되었습니다. 감사합니다.
안녕하세요,
2.6.3으로 업그레이드 한 후 다음 코드가 작동하지 않습니다.
Function.contains(Function.lower(Expression.property("email")), substring: Expression.string("Sri@xxx.com"))
.or(Function.contains(Function.lower(Expression.property("subject")), substring: Expression.string("Sri@xxx.com"))))
죄송합니다, 제 실수입니다. 무시하세요.