Docs Menu
Docs Home
/ /
Atlas Device SDK
/ /

데이터 쿼리 - Node.js SDK

이 페이지의 내용

  • 결과 컬렉션
  • 이 페이지의 예시
  • 쿼리 작성하기
  • Full Text Search로 필터링하기
  • 연산자
  • 비교 연산자
  • 로직 연산
  • 문자열 연산자
  • 집계 연산자
  • 컬렉션 연산자
  • 요약

Realm에서 데이터를 필터링하려면 RealmQL로 쿼리를 작성하세요. 쿼리는 항상 객체의 최신 상태를 반영하며 데이터가 변경될 때마다 앱을 업데이트할 수 있는 알림 을 보냅니다.

구문, 사용량 및 제한사항에 대한 자세한 내용은 Realm Query Language 참고 자료를 참조하세요.

결과 컬렉션은 쿼리 작업과 일치하는 영역의 모든 객체를 나타냅니다. 사용자는 대개 일반 JavaScript 배열 등의 컬렉션으로 작업할 수 있지만, 컬렉션은 실제로 일치하는 영역 객체를 메모리에 보관하지 않습니다. 그 대신 컬렉션은 일치하는 객체를 참조하는데, 이 객체들 스스로가 영역 파일의 데이터에 직접 매핑됩니다.

참고

페이지 매김 및 한도

일부 쿼리는 쿼리와 일치하는 모든 객체의 하위 세트에만 액세스하면 됩니다. Realm의 지연 로드형 컬렉션은 실제로 객체에 액세스할 때만 객체를 가져옵니다. 따라서 쿼리 결과를 제한하는 특수 메커니즘은 필요 없습니다.

그 예로 일치하는 객체를 한 번에 10개만 찾으려는 경우(예시: 여러 페이지로 나뉘는 제품 카탈로그에서), 결과 컬렉션의 10개 요소에 액세스하기만 하면 됩니다. 다음 페이지로 이동하려면 이전 페이지의 마지막 요소 바로 뒤에 나오는 인덱스에서부터 결과 컬렉션의 다음 10개 요소에 액세스하세요.

이 페이지의 예시에서는 작업 목록 앱의 간단한 데이터 세트를 사용합니다. 두 가지 Realm 객체 유형은 ProjectTask입니다. Task에는 이름, 담당자 이름, 완료 플래그가 있습니다. 우선 순위를 뜻하는 임의 숫자(클수록 중요도가 높음)와 작업 소요 시간(분)도 있습니다. Project에는 Tasks이(가) 0개 이상 있습니다.

이 두 가지 클래스, 즉 ProjectTask의 스키마를 참조하세요.

const TaskSchema = {
name: "Task",
properties: {
name: "string",
isComplete: "bool",
priority: "int",
progressMinutes: "int",
assignee: "string?"
}
};
const ProjectSchema = {
name: "Project",
properties: {
name: "string",
tasks: "Task[]"
}
};

데이터를 필터하다 하려면 RQL 로 만든 쿼리 를 Realm.Results.filtered()로 전달합니다.

const items = realm.objects("Item");
// Gets all items where the 'priority' property is 7 or more.
const importantItems = items.filtered("priority >= $0", 7);

RQL (RQL)을 사용하여 전체 텍스트 검색 (FTS) 인덱스 가 있는 속성에 대해 쿼리 할 수 있습니다. FTS 인덱싱된 속성 을 쿼리 하려면 필터링된 쿼리 에서 TEXT 술어를 사용합니다.

단어 앞에 하이픈(-) 문자를 붙여서 해당 단어에 대한 결과를 제외합니다. 예를 들어 swan -lake swan 을 검색하면 에 대한 모든 검색 결과가 lake 포함되며 이 포함된 결과는 제외됩니다.

다음 예시에서는 다음 Book 객체 모델을 사용하여 Book.name 필드를 쿼리합니다.

class Book extends Realm.Object<Book> {
name!: string;
price?: number;
static schema: ObjectSchema = {
name: "Book",
properties: {
name: { type: "string", indexed: "full-text" },
price: "int?",
},
};
}
// Retrieve book objects from realm
const books = realm.objects(Book);
// Filter for books with 'hunger' in the name
const booksWithHunger = books.filtered("name TEXT $0", "hunger");
// Filter for books with 'swan' but not 'lake' in the name
const booksWithSwanWithoutLake = books.filtered("name TEXT $0", "swan -lake");

Full Text Search(FTS, 전체 텍스트 검색) 인덱스는 다음 작업을 지원합니다.

  • 부울은 관련성 검색이 아닌 단어 검색과 일치합니다.

  • 토큰은 발음 부호 및 대소문자를 구분하지 않습니다.

  • 하이픈(-)으로 분할된 단어(예: full-text)는 두 개의 토큰으로 분할됩니다.

  • 토큰은 ASCII 및 Latin-1 Supplement(서양 언어)의 문자로만 구성될 수 있습니다. 그 외의 모든 문자는 공백으로 간주됩니다.

Realm 컬렉션 을 필터하다 하는 데 사용할 수 있는 연산자에는 여러 유형이 있습니다. 필터는 필터링되는 컬렉션 의 모든 객체 에 대한 연산자 표현식 을 평가 하는 방식으로 작동합니다. 표현식 이 true 로 확인되면 Realm 데이터베이스의 결과 컬렉션 에 해당 객체 가 포함됩니다.

표현식은 다음 중 한 가지로 구성되어 있습니다.

  • 현재 평가 중인 객체의 속성 이름입니다.

  • 연산자와 최대 2개의 인수 표현식입니다.

  • 리터럴 문자열, 숫자 또는 날짜

검색에서 가장 간단한 연산은 값을 비교하는 것입니다. Realm Query Language에는 ==, >, >=, in, <, <=, != 등의 표준 비교 연산자가 있습니다.

비교 연산자에 대한 전체 문서는 Realm Query Language 비교 연산자 참고 자료를 참조하세요.

다음 예시에서는 쿼리 엔진의 비교 연산자를 사용하여 다음 작업을 수행합니다.

  • priority 속성 값 중 우선 순위가 높은 것으로 간주되는 값을 임계값과 비교하여 우선순위가 작업을 찾습니다.

  • progressMinutes 속성이 특정 범위 내에 속하는지 확인하여 방금 시작한 작업이나 단기 실행 작업을 찾습니다.

  • 속성 assigneenull과 같은 작업을 찾아 할당되지 않은 작업을 찾습니다.

  • 이름 목록에 assignee 속성이 있는지 확인하여 Ali 또는 Jamie라는 특정한 팀원에게 할당된 작업을 찾을 수 있습니다.

const highPriorityTasks = tasks.filtered("priority > $0", 5);
const unassignedTasks = tasks.filtered("assignee == $0", null);
const lowProgressTasks = tasks.filtered("$0 <= progressMinutes && progressMinutes < $1", 1, 10);
const aliTasks = tasks.filtered("assignee == $0", "Ali");
console.log(
`Number of high priority tasks: ${highPriorityTasks.length}`,
`Number of unassigned tasks: ${unassignedTasks.length}`,
`Number of just-started or short-running tasks: ${lowProgressTasks.length}`,
`Number of tasks for Ali: ${aliTasks.length}`
);

논리 연산자를 사용하여 복합 조건자를 작성하세요. Realm Query Language에는 AND, OR, NOT 등의 표준 논리 연산자가 있습니다.

논리 연산자에 대한 전체 문서는 Realm Query Language 논리 연산자 참고 자료를 참조하세요.

다음 예시에서는 Realm Query Language의 논리 연산자를 사용하여 Ali의 완료된 작업을 모두 찾습니다. assignee 속성 값이 'Ali'와 같으면서 isComplete 속성 값이 true인 작업을 전부 찾으면 됩니다.

console.log(
"Number of Ali's complete tasks: " +
tasks.filtered("assignee == $0 && isComplete == $1", "Ali", true).length
);

==, beginsWith, contains, endsWith 등의 문자열 연산자를 사용하여 문자열 값을 비교할 수 있습니다. LIKE 연산자를 사용하여 정규 표현식과 유사한 와일드카드로 검색할 수도 있습니다.

문자열 연산자에 대한 전체 문서는 Realm Query Language 문자열 연산자 참고 자료를 참조하세요.

다음 예제에서는 Realm Query Language의 문자열 연산자를 사용하여 이름의 첫 글자가 'e'인 프로젝트와 이름에 'ie'가 포함된 프로젝트를 찾습니다.

// Use [c] for case-insensitivity.
console.log(
"Projects that start with 'e': " +
projects.filtered("name BEGINSWITH[c] $0", 'e').length
);
console.log(
"Projects that contain 'ie': " +
projects.filtered("name CONTAINS $0", 'ie').length
);

컬렉션을 순회하고 애그리게이션 연산자를 사용하여 컬렉션 을 단일 값으로 줄입니다.

애그리게이션 연산자에 대한 전체 문서는 Realm Query Language 애그리게이션 연산자 참고 자료를 참조하세요.

다음 예시에서는 애그리게이션 연산자를 사용하여 데이터의 다양한 패싯을 다음과 같이 표시합니다.

  • @avg 작업 우선 순위의 평균이 5보다 높은 프로젝트를 표시합니다.

  • @sum 장기 실행 프로젝트를 표시합니다.

console.log(
"Number of projects with average tasks priority above 5: " +
projects.filtered("tasks.@avg.priority > $0", 5).length
);
console.log(
"Number of long-running projects: " +
projects.filtered("tasks.@sum.progressMinutes > $0", 120).length
);

컬렉션 연산자는 규칙을 통해 객체에 지정된 목록 속성의 모든 요소에 특정 조건자를 적용하여 각 입력 컬렉션 객체를 출력 컬렉션으로 전달할지 여부를 결정합니다.

컬렉션 연산자에 대한 전체 문서는 Realm Query Language 컬렉션 연산자 참고 자료를 참조하세요.

다음 예시에서는 Realm Query Language의 컬렉션 연산자를 사용하여 다음 항목을 찾습니다.

  • ALL 완료된 작업이 없는 프로젝트

  • ANY 최우선 순위 작업이 있는 프로젝트

console.log(
"Number of projects with no complete tasks: " +
projects.filtered("ALL tasks.isComplete == $0", false).length
);
console.log(
"Number of projects with any top priority tasks: " +
projects.filtered("ANY tasks.priority == $0", 10).length
);
  • 영역 Query Language를 사용하여 영역의 데이터를 필터링하려면 영역.Results.filtered을(를) 사용하세요.

  • Realm Query Language에 대한 자세한 설명은 Realm Query Language 참고 자료를 참조하세요.

  • 결과를 필터링하는 데 사용할 수 있는 연산자는 비교, 논리, 문자열, 애그리게이션, 설정 등 여러 가지 범주로 나뉩니다.

돌아가기

삭제