Docs Menu
Docs Home
/ /
Atlas Device SDK

Realm Query Language

이 페이지의 내용

  • Realm SDK를 이용한 쿼리
  • 이 페이지의 예시
  • 표현식
  • 매개변수화된 쿼리
  • 쿼리 형식
  • 점 표기법
  • Nil 유형
  • 비교 연산자
  • 로직 연산
  • 문자열 연산자
  • ObjectId 및 UUID 연산자
  • 산술 연산자
  • 유형 연산자
  • 사전 연산자
  • 날짜 연산자
  • 집계 연산자
  • 컬렉션 연산자
  • 목록 비교
  • 전문 검색
  • Full Text Search 토크나이저 세부 정보
  • 지리공간 쿼리
  • 역링크 쿼리
  • 하위 쿼리
  • 정렬, 구분 및 제한
  • Flexible Sync RQL 제한사항
  • 인덱싱된 쿼리 가능 필드 구독 요구 사항
  • Flexible Sync에서 지원되지 않는 쿼리 연산자
  • 목록 쿼리
  • 임베디드 또는 링크된 객체
  • 쿼리 크기 제한

RQL (RQL)은 영역 에서 객체를 검색할 때 검색을 제한하는 문자열 기반 쿼리 언어 입니다. SDK 전용 메서드는 쿼리를 Realm 쿼리 엔진 으로 전달하고, 이 엔진은 영역 에서 일치하는 객체를 조회합니다. RQL 구문은 NSPredicate를 기반으로 합니다.

쿼리는 쿼리 대상 컬렉션의 모든 객체에 대해 조건자를 평가합니다. 조건자가 true(으)로 확인되면 해당 객체가 결과 컬렉션에 포함됩니다.

대부분의 Realm SDK에서는 SDK의 필터 또는 쿼리 메서드와 함께 Realm Query Language를 사용할 수 있습니다. Swift SDK는 NSPredicate 쿼리 API를 사용하기 때문에 예외입니다. 일부 SDK는 해당 언어로 영역을 쿼리하기 위한 관용적 API도 지원합니다.

영역 쿼리를 위한 SDK별 방법에 대한 자세한 내용은 SDK 설명서를 참조하세요.

C++ SDK 는 현재 RQL 의 하위 집합만 구현합니다. C++ SDK 에서 Realm 을 쿼리하는 예제는 다음을 참조하세요.

참고

Swift SDK는 Realm Query Language를 지원하지 않습니다.

Swift SDK는 Realm Query Language를 사용한 쿼리를 지원하지 않습니다. 대신 NSPredicate를 사용하여 Realm을 쿼리할 수 있습니다. Swift SDK에서 Realm을 쿼리하는 예는 데이터 필터링 - Swift SDK를 참조하세요.

Realm Query Language를 사용해서 Realm Studio에서 데이터를 검색할 수도 있습니다. Realm Studio는 Realm 파일의 조회, 편집, 설계를 할 수 있는 시각 도구입니다.

이 페이지의 여러 예시에서는 해야 할 일 목록 앱에 간단한 데이터 세트를 사용합니다. 두 가지 Realm 객체 유형은 ProjectItem입니다.

  • Item에는 이름, 담당자 이름, 완료 플래그가 있습니다. 우선 순위를 뜻하는 임의 숫자(클수록 중요도가 높음)와 작업 소요 시간(분)도 있습니다.

  • Project은(는) 0 이상의 Items 값을 갖고 있으며, 완료될 것으로 예상되는 해야 할 일 항목의 최소 개수에 대한 선택적 할당량입니다.

아래에서 이 두 클래스의 스키마 ProjectItem를 참조하세요.

public class Item extends RealmObject {
ObjectId id = new ObjectId();
String name;
Boolean isComplete = false;
String assignee;
Integer priority = 0;
Integer progressMinutes = 0;
@LinkingObjects("items")
final RealmResults<Project> projects = null;
}
public class Project extends RealmObject {
ObjectId id = new ObjectId();
String name;
RealmList<Item> items;
Integer quota = null;
}
open class Item(): RealmObject() {
var id: ObjectId = new ObjectId()
@FullText
lateinit var name: String
var isComplete: Boolean = false
var assignee: String? = null
var priority: Int = 0
var progressMinutes: Int = 0
}
open class Project(): RealmObject() {
var id: ObjectId = new ObjectId()
lateinit var name: String
lateinit var items: RealmList<Item>
var quota: Int? = null
}
public class Item : RealmObject
{
[PrimaryKey]
[MapTo("_id")]
public ObjectId Id { get; set; } = ObjectId.GenerateNewId();
[MapTo("name")]
[Indexed(IndexType.FullText)]
public string Name { get; set; }
[MapTo("isComplete")]
public bool IsComplete { get; set; } = false;
[MapTo("assignee")]
public string Assignee { get; set; }
[MapTo("priority")]
public int Priority { get; set; } = 0;
[MapTo("progressMinutes")]
public int ProgressMinutes { get; set; } = 0;
[MapTo("projects")]
[Backlink(nameof(Project.Items))]
public IQueryable<Project> Projects { get; }
}
public class Project : RealmObject
{
[PrimaryKey]
[MapTo("_id")]
public ObjectId Id { get; set; } = ObjectId.GenerateNewId();
[MapTo("name")]
public string Name { get; set; }
[MapTo("items")]
public IList<Item> Items { get; }
[MapTo("quota")]
public int Quota { get; set; }
}
const ItemModel = {
name: "Item",
properties: {
id: "objectId",
name: {type: "string", indexed: "full-text"},
isComplete: { type: "bool", default: false },
assignee: "string?",
priority: {
type: "int",
default: 0,
},
progressMinutes: {
type: "int",
default: 0,
},
projects: {
type: "linkingObjects",
objectType: "Project",
property: "items",
},
},
primaryKey: "id",
};
const ProjectModel = {
name: "Project",
properties: {
id: "objectId",
name: "string",
items: "Item[]",
quota: "int?",
},
primaryKey: "id",
};
const ItemModel = {
name: "Item",
properties: {
id: "objectId",
name: {type: "string", indexed: "full-text"},
isComplete: { type: "bool", default: false },
assignee: "string?",
priority: {
type: "int",
default: 0,
},
progressMinutes: {
type: "int",
default: 0,
},
projects: {
type: "linkingObjects",
objectType: "Project",
property: "items",
},
},
primaryKey: "id",
};
const ProjectModel = {
name: "Project",
properties: {
id: "objectId",
name: "string",
items: "Item[]",
quota: "int?",
},
primaryKey: "id",
};
class Item(): RealmObject {
@PrimaryKey
var _id: ObjectId = ObjectId()
@FullText
var name: String = ""
var isComplete: Boolean = false
var assignee: String? = null
var priority: Int = 0
var progressMinutes: Int = 0
}
class Project(): RealmObject {
@PrimaryKey
var _id: ObjectId = ObjectId()
var name: String = ""
var items: RealmList<Item> = realmListOf<Item>()
var quota: Int? = null
}
part 'models.realm.dart';
@RealmModel()
class _Project {
@MapTo("_id")
@PrimaryKey()
late ObjectId id;
late String name;
late List<_Item> items;
int? quota;
}
@RealmModel()
class _Item {
@MapTo("_id")
@PrimaryKey()
late ObjectId id;
@Indexed(RealmIndexType.fullText)
late String name;
bool isComplete = false;
String? assignee;
int priority = 0;
int progressMinutes = 0;
}

필터는 조건자의 표현식으로 구성되어 있습니다. 표현식은 다음 중 한 가지로 구성되어 있습니다.

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

  • 연산자와 최대 2개의 인수 표현식입니다. 그 예로 A + B 표현식에서는 A + B 전체가 표현식이지만, A와(과) B도 연산자 +에 대한 인수 표현식입니다.

  • 값으로는 문자열('hello') 또는 숫자(5) 등이 있습니다.

"progressMinutes > 1 AND assignee == $0", "Ali"

매개변수화된 쿼리를 생성해서 작성된 Realm Query Language 성명서에 변수를 보간하세요. 보간된 변수의 구문은 0(으)로 시작하는 $<int>입니다. Realm Query Language를 사용하는 Realm SDK 메서드에 위치 인수를 추가 인수로 전달하세요.

값이 $0인 매개변수를 1개만 포함시키세요.

"progressMinutes > 1 AND assignee == $0", "Ali"

$0(으)로 시작하는 오름차순 정수로 매개변수를 여러 개 포함시키세요.

"progressMinutes > $0 AND assignee == $1", 1, "Alex"

아래 표는 다음 데이터 유형에 대해 직렬화 및 매개 변수화할 때 쿼리의 형식을 지정하는 방법을 보여줍니다.

유형
매개변수화된 예시
직렬화된 예시
참고
부울
"setting == $0", false
"setting == false"
true 또는 false 값.
"name == $0", "George"
"name == 'George'"
stringchar 데이터 유형에 적용됩니다.
"age > $0", 5.50
"age > 5.50"
int, short, long, double, Decimal128float 데이터 유형에 적용됩니다.
"date < $0", dateObject
"date < 2021-02-20@17:30:15:0"

매개 변수화된 날짜 쿼리의 경우 날짜 객체를 전달해야 합니다. 직렬화된 날짜 쿼리의 경우 날짜를 다음 형식으로 표현할 수 있습니다.

  • 명시적 날짜 및 시간- YYYY-MM-DD@HH:mm:ss:nn (year-month-day@hours:minutes:seconds:nanoseconds)

  • datetime Unix epoch를 기준으로 한 기준 - Ts:n (T, 시간의 시작을 나타냅니다. s, 초, n, 나노초)

  • 매개변수화된 Date 객체

"_id == $0", oidValue
"_id == oid(507f1f77bcf86cd799439011)"
매개변수화된 ObjectId 쿼리의 경우 ObjectId를 전달해야 합니다. 직렬화된 ObjectId 쿼리의 문자열 표현은 oid(<ObjectId String>)입니다.
"id == $0", uuidValue
"id == uuid(d1b186e1-e9e0-4768-a1a7-c492519d47ee)"
매개변수화된 UUID 쿼리의 경우 UUID를 전달해야 합니다. 직렬화된 UUID 쿼리의 문자열 표현은 uuid(<UUID String>)입니다.
바이너리
"value == $0", "binary"
"value == 'binary'"
ASCII 문자의 경우, RQL은 따옴표를 사용하여 이진 값을 문자열처럼 직렬화합니다. 인쇄할 수 없는 문자의 경우에는 RQL은 바이너리를 기본 64값으로 직렬화합니다.
"ANY items.name == {$0, $1}", "milk", "bread"
"ANY items.name == {'milk', 'bread'}"
목록, 컬렉션 및 세트에 적용됩니다. 목록의 각 노드에 대해 매개 변수화된 값을 사용해야 합니다.
RealmObject
"ANY items == $0", obj("Item", oid(6489f036f7bd0546377303ab))
"ANY items == obj('Item', oid(6489f036f7bd0546377303ab))"
RealmObject를 전달하기 위해서는 객체의 클래스와 프라이머리 키가 있어야 합니다.

객체 속성을 참조할 때는 점 표기법 을 사용하여 해당 객체의 하위 속성을 참조할 수 있습니다. 점 표기법을 사용하여 내장된 객체의 속성과 관계를 참조할 수도 있습니다.

그 예로 어떤 쿼리는 Workplace 객체를 참조하는 workplace 속성을 가진 객체를 대상으로 합니다. Workplace 객체에는 내장된 객체 속성인 address이(가) 있습니다. 해당 주소의 우편번호 속성을 참조하기 위해 점 표기법을 연결할 수 있습니다.

"workplace.address.zipcode == 10019"

Realm Query Language에는 null 포인터를 나타내는 nil 유형이 포함됩니다. 쿼리에서 직접, 혹은 매개변수화된 쿼리를 사용하여 nil을(를) 참조할 수 있습니다. 매개변수화된 쿼리를 사용할 경우, 각 SDK는 해당 null 포인터를 nil(으)로 매핑합니다.

"assignee == nil"
// comparison to language null pointer
"assignee == $0", null

검색에서 가장 간단한 작업은 값을 비교하는 것입니다.

중요

유형이 일치해야 함

연산자의 양쪽에 있는 형식은 동일해야 합니다. 예를 들어, ObjectId를 문자열과 비교하면 전제 조건 실패가 발생하며 다음과 같은 메시지가 표시됩니다.

"Expected object of type object id for property 'id' on object of type
'User', but received: 11223344556677889900aabb (Invalid value)"

모든 숫자 유형을 십진수, 부동 소수점 및 Decimal128을 포함한 다른 숫자 유형과 비교할 수 있습니다.

연산자
설명
BETWEEN {number1, number2}
왼쪽 숫자 또는 날짜 표현식이 오른쪽 범위 사이에 있거나 같으면 true(으)로 평가합니다. 날짜의 경우 왼쪽 날짜가 오른쪽 날짜 범위 내에 있으면 true(으)로 평가합니다.
==, =
왼쪽 표현식이 오른쪽 표현식과 같은 경우 true(으)로 평가합니다.
>
왼쪽 숫자 또는 날짜 표현식이 오른쪽 숫자 또는 날짜 표현식보다 크면 true(으)로 평가합니다. 날짜의 경우 왼쪽 날짜가 오른쪽 날짜보다 늦으면 true(으)로 평가합니다.
>=
왼쪽 숫자 또는 날짜 표현식이 오른쪽 숫자 또는 날짜 표현식보다 크거나 같으면 true(으)로 평가합니다. 날짜의 경우 왼쪽 날짜가 오른쪽 날짜보다 늦거나 같으면 true(으)로 평가합니다.
IN
왼쪽 표현식이 오른쪽 목록에 있는 경우 true(으)로 평가합니다. 이는 == ANY 값에 상응하며 해당 값의 약어로 사용됩니다.
<
왼쪽 숫자 또는 날짜 표현식이 오른쪽 숫자 또는 날짜 표현식보다 작으면 true(으)로 평가합니다. 날짜의 경우 왼쪽 날짜가 오른쪽 날짜보다 이르면 true(으)로 평가합니다.
<=
왼쪽 숫자 표현식이 오른쪽 숫자 표현식보다 작거나 같으면 true(으)로 평가합니다. 날짜의 경우 왼쪽 날짜가 오른쪽 날짜보다 이르거나 같으면 true(으)로 평가합니다.
!=, <>
왼쪽 표현식이 오른쪽 표현식과 같지 않은 경우 true(으)로 평가합니다.

예시

아래 예시에서는 Realm Query Language의 비교 연산자를 사용하여 다음 작업을 수행합니다.

  • priority 속성의 값 중 우선 순위가 높은 것으로 간주되는 값을 임계값 수치와 비교하여 우선 순위가 높은 해야 할 일 항목을 찾습니다.

  • progressMinutes 속성이 특정 값 이상인지 확인하여 장기 실행 해야 할 일 항목을 찾습니다.

  • assignee 속성이 null와(과) 같은 항목을 검색하여 미할당 해야 할 일 항목을 찾습니다.

  • progressMinutes 속성이 두 숫자 사이에 있는 항목을 검색하여 특정 시간 범위 이내의 해야 할 일 항목을 찾습니다.

  • 지정된 목록에서 일정량의 progressMinutes이(가) 포함된 해야 할 일 항목을 찾습니다.

// Find high priority to-do items by comparing the value of the ``priority``
// property value with a threshold number, above which priority can be considered high.
"priority > $0", 5
// Find long-running to-do items by seeing if the progressMinutes property is at or above a certain value.
"progressMinutes > $0", 120
// Find unassigned to-do items by finding items where the assignee property is equal to null.
"assignee == $0", null
// Find to-do items within a certain time range by finding items
// where the progressMinutes property is between two numbers.
"progressMinutes BETWEEN { $0 , $1 }", 30, 60
// Find to-do items with a certain amount of progressMinutes from the given list.
"progressMinutes IN { $0, $1, $2, $3, $4, $5 }", 10, 20, 30, 40, 50, 60

논리 연산자를 사용하여 복합 조건자를 작성합니다.

연산자
설명
AND
&&
왼쪽 및 오른쪽 표현식이 모두 true인 경우 true(으)로 평가합니다.
NOT
!
주어진 표현식의 결과를 무효화합니다.
OR
||
두 표현식 중 하나가 true를 반환하면 true(으)로 평가합니다.

예시

쿼리 언어의 논리 연산자를 사용하면 Ali의 완료된 해야 할 일 항목을 전부 찾을 수 있습니다. 다시 말해, assignee 속성 값이 'Ali'와 같으면서 isComplete 속성 값이 true인 항목을 전부 찾으면 됩니다.

"assignee == $0 AND isComplete == $1", "Ali", true

이러한 문자열 연산자를 사용하여 문자열 값을 비교합니다. 정규식과 유사한 와일드카드를 사용하면 더욱 유연하게 검색할 수 있습니다.

참고

해당 문자열 연산자와 함께 사용할 수 있는 수정자는 다음과 같습니다.

  • [c] 대소문자를 구분하지 않도록

    "name CONTAINS[c] $0", 'a'
연산자
설명
BEGINSWITH
왼쪽 문자열 표현식이 오른쪽 문자열 표현식으로 시작하면 true(으)로 평가합니다. 이는 contains와(과) 비슷하지만, 오른쪽 문자열 표현식이 왼쪽 문자열 표현식의 시작 부분에 있는 경우에만 일치합니다.
CONTAINS
오른쪽 문자열 표현식이 왼쪽 문자열 표현식의 어느 위치에든 있으면 true(으)로 평가합니다.
ENDSWITH
왼쪽 문자열 표현식이 오른쪽 문자열 표현식으로 끝나는 경우 true(으)로 평가합니다. 이는 contains와(과) 비슷하지만 왼쪽 문자열 표현식이 오른쪽 문자열 표현식의 끝에 있는 경우에만 일치됩니다.
LIKE

왼쪽 문자열 표현식이 오른쪽 문자열 와일드카드 문자열 표현식과 일치하는 경우 true(으)로 평가합니다. 와일드카드 문자열 표현식은 일반 문자를 두 개의 특수 와일드카드 문자와 함께 사용하는 문자열입니다.

  • * 와일드카드는 0개 또는 그 이상의 어느 문자와든 일치합니다.

  • ? 와일드카드는 어느 문자와든 일치합니다.

예를 들어 와일드카드 문자열 'd?g'는 'dog', 'dig', 'dug'과 일치되지만 'ding', 'dg' 또는 'a dog'와는 일치되지 않습니다.

==, =
왼쪽 문자열이 오른쪽 문자열과 사전순으로 동일한 경우 true(으)로 평가합니다.
!=, <>
왼쪽 문자열이 오른쪽 문자열과 사전 순으로 같지 않은 경우 true(으)로 평가합니다.

예시

쿼리 엔진의 문자열 연산자를 사용하면 다음 항목을 찾을 수 있습니다.

  • 이름의 첫 글자가 'e'인 프로젝트

  • 이름에 'ie'가 포함된 프로젝트

"name BEGINSWITH[c] $0", 'e'
"name CONTAINS $0", 'ie'

BSON ObjectIdUUID 를 쿼리합니다. 이러한 데이터 유형은 종종 프라이머리 키로 사용됩니다.

ObjectId로 쿼리하려면 매개 변수화된 쿼리를 사용하세요. 쿼리하려는 ObjectId 또는 UUID를 인수로 전달합니다.

"_id == $0", oidValue

평가하려는 ObjectId의 문자열 표현을 oid(<ObjectId String>)에 입력할 수도 있습니다.

"_id == oid(6001c033600510df3bbfd864)"

UUID로 쿼리하려면 평가하려는 UUID의 문자열 표현을 uuid(<UUID String>)에 입력하세요.

"id == uuid(d1b186e1-e9e0-4768-a1a7-c492519d47ee)"
연산자
설명
==, =
왼쪽 값이 오른쪽 값과 같은 경우 true(으)로 평가합니다.
!=, <>
왼쪽 값이 오른쪽 값과 같지 않은 경우 true(으)로 평가합니다.

숫자 데이터 유형을 평가할 때 RQL 표현식의 한 쪽에서 기본 연산을 수행합니다.

"2 * priority > 6"
// Is equivalent to
"priority >= 2 * (2 - 1) + 2"

수학 연산에서 여러 객체 속성을 함께 사용할 수도 있습니다.

"progressMinutes * priority == 90"
연산자
설명
*
곱셈.
/
나눗셈.
+
덧셈.
-
뺄셈.
()
여러 표현식을 함께 그룹화하세요.

@type 연산자를 사용하여 속성의 유형을 확인하세요. 이 유형 연산자는 유형과 사전이 혼합된 경우에만 사용할 수 있습니다.

데이터 유형 이름의 문자열 표현과 비교하여 속성을 평가합니다. SDK 언어의 데이터 유형에서 Realm 데이터 유형으로 매핑하기에 대한 SDK 문서를 참조하세요.

연산자
설명
@type
속성의 유형이 문자열로 된 속성 이름인지 확인하세요. ==와(과) !=을(를) 사용하여 동등성을 비교하세요.
"mixedType.@type == 'string'"
"mixedType.@type == 'bool'"

이 사전 연산자들을 사용하여 사전 값을 비교하세요.

연산자
설명
@values
오른쪽 표현식에 값이 지정된 객체를 반환합니다.
@keys
오른쪽 표현식에 키가 지정된 객체를 반환합니다.
@size, @count
사전 내 요소의 수입니다.
Dictionary['key']
사전의 키에서 이 값에 액세스하세요.
ALL | ANY | NONE <property>.@type
사전에 특정 유형의 속성이 포함되어 있는지 확인합니다.

사전 연산자를 비교 연산자 와 함께 사용하여 사전 키와 값을 기준으로 객체를 필터링할 수도 있습니다. 다음 예제에서는 사전 연산자를 비교 연산자와 함께 사용하는 몇 가지 방법을 보여줍니다. 모든 예제는 dict 이라는 이름의 딕셔너리 속성을 가진 Realm 객체 컬렉션을 쿼리합니다.

예시

다음 예시에서는 다양한 사전 연산자를 사용합니다.

// Evaluates if there is a dictionary key with the name 'foo'
"ANY dict.@keys == $0", 'foo'
// Evaluates if there is a dictionary key with key 'foo' and value 'bar
"dict['foo'] == $0", 'bar'
// Evaluates if there is greater than one key-value pair in the dictionary
"dict.@count > $0", 1
// Evaluates if dictionary has property of type 'string'
"ANY dict.@type == 'string'"
// Evaluates if all the dictionary's values are integers
"ALL dict.@type == 'bool'"
// Evaluates if dictionary does not have any values of type int
"NONE dict.@type == 'double'"
// ANY is implied.
"dict.@type == 'string'"

영역의 날짜 유형을 쿼리합니다.

사용 중인 SDK 언어의 날짜 데이터 유형을 일반적으로 매개 변수화된 쿼리를 사용해 쿼리에 전달해야 합니다.

"timeCompleted < $0", someDate

다음 두 가지 방법으로 날짜를 지정할 수도 있습니다.

  • 특정 날짜(UTC)- YYYY-MM-DD@HH:mm:ss:nnnnnnnnnn (년-월-일@시간:분:초:나노초), UTC. @ T 을(를) 사용하여 날짜와 시간을 구분할 수도 있습니다.

  • Unix epoch Ts:n T 이후의 시간(초) - , 여기서s 는 시간의 시작을 나타내고,n 는 초 수이며, 는 나노초 수입니다.

날짜는 비교 연산자를 지원합니다.

예시

다음 예는 매개변수화된 쿼리를 날짜 객체에 사용하는 방법을 보여줍니다.

var date = new Date("2021-02-20@17:30:15:0");
"timeCompleted > $0", date

Realm 객체의 컬렉션 속성에 애그리게이션 연산자를 적용합니다. 애그리게이션 연산자는 컬렉션을 순회하여 이를 하나의 값으로 줄입니다.

연산자
설명
@avg
컬렉션 전체에 지정된 숫자 속성의 평균값으로 평가합니다. 어떤 값이든 null(이)라면 결과에서 계산되지 않습니다.
@count
주어진 컬렉션의 객체 수로 평가합니다.
@max
컬렉션 전체에 지정된 숫자 속성의 최댓값으로 평가합니다. null 값은 무시됩니다.
@min
컬렉션 전체에 지정된 숫자 속성의 최솟값으로 평가합니다. null 값은 무시됩니다.
@sum
컬렉션 전체에 지정된 숫자 속성의 합계(null 값은 제외)로 평가합니다.

예시

이 예는 다음 기준을 충족하는 할 일 항목이 포함된 프로젝트를 모두 쿼리합니다.

  • 항목 우선 순위의 평균이 5보다 높은 프로젝트입니다.

  • 우선 순위가 5 미만인 항목이 있는 프로젝트입니다.

  • 우선 순위가 5보다 높은 항목이 있는 프로젝트입니다.

  • 항목이 5개보다 많은 프로젝트입니다.

  • 장기 실행 항목이 있는 프로젝트입니다.

var priorityNum = 5;
"items.@avg.priority > $0", priorityNum
"items.@max.priority < $0", priorityNum
"items.@min.priority > $0", priorityNum
"items.@count > $0", 5
"items.@sum.progressMinutes > $0", 100

컬렉션 연산자를 사용하면 객체 컬렉션 내 목록 속성을 쿼리할 수 있습니다. 컬렉션 연산자는 객체에 지정된 목록 속성의 모든 요소에 조건자를 적용하여 컬렉션을 필터링합니다. 조건자가 true을(를) 반환하면 해당 객체가 출력 컬렉션에 포함됩니다.

연산자
설명
ALL
컬렉션의 모든 객체에 대해 조건자가 true(으)로 평가하는 객체를 반환합니다.
ANY, SOME
컬렉션의 임의 객체에 대해 조건자가 true(으)로 평가하는 객체를 반환합니다.
NONE
컬렉션의 모든 객체에 대해 조건자가 false로 평가되는 객체를 반환합니다.

예시

이 예에서는 컬렉션 연산자를 사용하여 특정 기준과 일치하는 할 일 항목이 포함된 프로젝트를 찾습니다.

// Projects with no complete items.
"NONE items.isComplete == $0", true
// Projects that contain a item with priority 10
"ANY items.priority == $0", 10
// Projects that only contain completed items
"ALL items.isComplete == $0", true
// Projects with at least one item assigned to either Alex or Ali
"ANY items.assignee IN { $0 , $1 }", "Alex", "Ali"
// Projects with no items assigned to either Alex or Ali
"NONE items.assignee IN { $0 , $1 }", "Alex", "Ali"

비교 연산자컬렉션 연산자 를 사용하여 데이터 목록을 기준으로 필터링할 수 있습니다.

모든 유형의 유효한 목록을 비교할 수 있습니다. 여기에 포함되는 것은 다음과 같습니다.

  • 영역 객체의 컬렉션을 사용하여 영역의 다른 데이터에 대해 필터링할 수 있습니다.

    "oid(631a072f75120729dc9223d9) IN items.id"
  • 목록을 쿼리에 직접 지정하면 정적 데이터와 비교하면서 필터링할 수 있습니다. 정적 목록은 여는 중괄호({)와 닫는 중괄호(})로 묶인 리터럴 값의 쉼표로 구분된 목록으로 정의합니다.

    "priority IN {0, 1, 2}"
  • 매개 변수화된 표현식 으로 전달된 네이티브 목록 객체를 사용하여 애플리케이션 데이터를 쿼리에 직접 전달할 수 있습니다.

    const ids = [
    new BSON.ObjectId("631a072f75120729dc9223d9"),
    new BSON.ObjectId("631a0737c98f89f5b81cd24d"),
    new BSON.ObjectId("631a073c833a34ade21db2b2"),
    ];
    const parameterizedQuery = realm.objects("Item").filtered("id IN $0", ids);

컬렉션 연산자를 지정하지 않은 경우 목록 표현식은 ANY 연산자로 기본 설정됩니다.

예시

이 두 목록 쿼리는 다음과 같이 상응합니다.

  • age == ANY {18, 21}

  • age == {18, 21}

이 두 쿼리 모두 연령 속성이 18 또는 21인 객체를 반환합니다. 연령이 18 또는 21에 해당하지 않는 경우에만 객체를 반환하여 반대 작업을 수행할 수도 있습니다.

  • age == NONE {18, 21}

다음 표에서는 컬렉션 연산자가 목록 및 비교 연산자와 상호 작용하는 방식을 보여주는 예를 찾을 수 있습니다.

표현식
일치?
이유
ANY {1, 2, 3} > ALL {1, 2}
true
왼쪽의 값(3)이 오른쪽의 일부 값(1과 2 둘 다)보다 큼
ANY {1, 2, 3} == NONE {1, 2}
true
3이 1 또는 2 중 어떤 값과도 일치하지 않음
ANY {4, 8} == ANY {5, 9, 11}
거짓
4와 8 둘 다 오른쪽의 어떤 값(5, 9 또는 11)과도 일치하지 않음
ANY {1, 2, 7} <= NONE {1, 2}
true
왼쪽의 값(7)이 1과 2 양쪽과 같거나 작지 않음
ALL {1, 2} IN ANY {1, 2, 3}
true
왼쪽의 모든 값(1과 2)이 1, 2 또는 3과 같음
ALL {3, 1, 4, 3} == NONE {1, 2}
거짓
1이 NONE 목록의 값(1 또는 2)과 일치함
ALL {} in ALL {1, 2}
true
빈 목록이 모든 목록과 일치함
NONE {1, 2, 3, 12} > ALL {5, 9, 11}
거짓
12가 오른쪽의 모든 값(5, 9, 11)보다 큼
NONE {4, 8} > ALL {5, 9, 11}
true
4와 8 둘 다 오른쪽의 일부 값(5, 9 또는 11)보다 작음
NONE {0, 1} < NONE {1, 2}
true
0과 1 둘 다 1과 2 중 어떤 값보다도 작지 않음

RQL을 사용하여 Full Text Search(FTS) 어노테이션이 있는 속성에 대해 쿼리할 수 있습니다. FTS는 관련성 검색보다는 부울 일치 단어 검색을 지원합니다. 속성에서 FTS를 활성화하는 방법에 대한 자세한 내용은 SDK에 대한 FTS 설명서를 참조하세요.

이러한 속성을 쿼리하려면 쿼리에 TEXT 조건자를 사용합니다.

전체 단어나 구문을 검색하거나 다음 문자로 결과를 제한할 수 있습니다.

  • 단어 앞에 - 문자를 붙여서 해당 단어에 대한 결과를 제외시키세요.

  • 접두사 끝에 * 문자를 배치하여 접두사를 지정합니다. 접미사 검색은 현재 지원되지 않습니다.

다음 예시에서는 Item.name 속성을 쿼리합니다.

// Filter for items with 'write' in the name
"name TEXT $0", "write"
// Find items with 'write' but not 'tests' using '-'
"name TEXT $0", "write -tests"
// Find items starting with 'wri-' using '*'
"name TEXT $0", "wri*"

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

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

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

  • 하이픈(-)으로 나뉜 단어는 두 개의 토큰으로 나뉩니다. 예를 들어 full-text은(는) fulltext(으)로 분할됩니다.

geoWithin 연산자를 사용하여 지리 공간적 데이터를 쿼리할 수 있습니다. geoWithin 연산자는 사용자 지정 포함된 객체의 coordinates 속성과 지리 공간적 도형에서 위도/경도 쌍을 사용합니다. 연산자는 cordinates 점이 지리 공간적 형태 내에 포함되어 있는지 확인합니다.

쿼리에 지원되는 지리 공간적 도형은 다음과 같습니다.

  • GeoCircle

  • GeoBox

  • GeoPolygon

지리 공간적 데이터를 쿼리하려면 다음을 수행합니다.

  1. 내장된 지리 공간적 데이터가 포함된 속성을 사용하여 객체를 만듭니다.

  2. 지리 공간적 도형을 정의하여 쿼리의 경계를 설정합니다.

  3. geoWithin RQL 연산자를 사용하여 쿼리합니다.

다음 쿼리에서는 내장된 location 속성의 좌표가 GeoCircle 도형 smallCircle 내에 포함되어 있는지 확인합니다.

"location geoWithin $0", smallCircle

내장된 지리 공간적 데이터로 지리 공간적 모양 및 객체를 정의하는 방법에 대한 자세한 내용은 SDK의 지리 공간적 설명서를 참조하세요.

역링크는 다른 객체를 참조하는 객체를 조회할 수 있는 역관계 링크입니다. 역링크는 객체 스키마에 정의된 일대일 및 다대다 관계를 사용하지만 방향은 반대입니다.스키마에서 정의하는 모든 관계에는 암시적으로 해당 역링크가 있습니다.

@links.<ObjectType>.<PropertyName> 구문을 사용하여 쿼리에서 역링크에 액세스할 수 있습니다. 여기서 <ObjectType><PropertyName>은(는) 쿼리된 객체 유형을 참조하는 객체 유형의 특정 속성을 나타냅니다.

// Find items that belong to a project with a quota greater than 10 (@links)
"@links.Project.items.quota > 10"

linkingObjects 속성을 정의하여 데이터 모델에 역링크를 명시적으로 포함할 수도 있습니다. 이렇게 하면 표준 점 표기법을 사용하여 할당된 속성 이름을 통해 역링크를 참조할 수 있습니다.

// Find items that belong to a project with a quota greater than 10 (LinkingObjects)
"projects.quota > 10"

역링크의 결과는 컬렉션처럼 취급되며 컬렉션 연산자를 지원합니다.

// Find items where any project that references the item has a quota greater than 0
"ANY @links.Project.items.quota > 0"
// Find items where all projects that reference the item have a quota greater than 0
"ALL @links.Project.items.quota > 0"

역링크 컬렉션에 대해 애그리게이션 연산자를 사용할 수 있습니다.

// Find items that are referenced by multiple projects
"projects.@count > 1"
// Find items that are not referenced by any project
"@links.Project.items.@count == 0"
// Find items that belong to a project where the average item has
// been worked on for at least 5 minutes
"@links.Project.items.items.@avg.progressMinutes > 10"

@links@count 연산자를 직접 사용하면 객체를 가리키는 모든 관계의 수를 쿼리할 수 있습니다.

// Find items that are not referenced by another object of any type
"@links.@count == 0"

SUBQUERY() 조건자 함수를 사용하여 다른 쿼리로 목록 속성을 반복하세요.

하위 쿼리는 다음 시나리오에 유용합니다.

  • 여러 조건에서 목록 속성의 각 객체가 일치하는 경우

  • 하위 쿼리와 일치하는 객체의 수를 계산하는 경우

SUBQUERY() 다음과 같은 구조를 가진 경우:

SUBQUERY(<collection>, <variableName>, <predicate>)
  • collection: 반복할 속성의 이름입니다.

  • variableName: 하위 쿼리에 사용할 요소의 변수 이름입니다.

  • predicate: 하위 쿼리 조건자입니다. variableName(으)로 지정된 변수를 사용하여 현재 반복형 요소를 참조하세요.

하위 쿼리는 지정된 컬렉션을 반복하고 컬렉션의 각 객체와 비교하여 지정된 조건자를 확인합니다. 조건자는 SUBQUERY()(으)로 전달된 변수 이름을 사용하여 현재 반복형 객체를 참조할 수 있습니다.

하위 쿼리 표현식은 객체 목록으로 확인됩니다. Realm은 하위 쿼리의 결과에 대해 @count 애그리게이션 연산자만 지원합니다. 이로써 하위 쿼리 입력 컬렉션에서 조건자와 일치하는 객체의 수를 계산할 수 있습니다.

유효한 표현식의 다른 어떤 숫자에 대해서도 하위 쿼리 결과의 개수를 사용할 수 있습니다. 특히 개수를 숫자 0와(과) 비교해서 일치하는 모든 객체를 반환할 수 있습니다.

예시

다음 예시에서는 프로젝트의 컬렉션에 대한 하위 쿼리 필터 2개를 보여줍니다.

// Returns projects with items that have not been completed
// by a user named Alex.
"SUBQUERY(items, $item, $item.isComplete == false AND $item.assignee == 'Alex').@count > 0"
// Returns the projects where the number of completed items is
// greater than or equal to the value of a project's `quota` property.
"SUBQUERY(items, $item, $item.isComplete == true).@count >= quota"

추가 연산자를 사용하여 원하는 쿼리의 결과 컬렉션을 정렬하고 제한하세요.

연산자
설명
SORT

비교할 속성의 이름을 지정하고 오름차순(ASC)으로 정렬할지, 아니면 내림차순(DESC)으로 정렬할지 여부를 지정하세요. SORT 필드를 여러 개 지정하는 경우에는 각 필드의 정렬 순서를 지정해야 합니다. 정렬 필드가 여러 개인 경우, 이 쿼리는 첫 번째 필드를 기준으로 정렬한 후에 두 번째 필드를 기준으로 정렬합니다.

그 예로 SORT (priority DESC, name DESC)인 경우 이 쿼리는 우선 순위를 기준으로 정렬된 값을 반환한 다음, 우선 순위 값이 같으면 이름을 기준으로 정렬합니다.

DISTINCT
비교할 속성의 이름을 지정하세요. 결과 컬렉션에서 해당 속성의 중복 항목을 제거하세요. DISTINCT 필드를 여러 개 지정하는 경우 이 쿼리는 첫 번째 필드를 기준으로 중복 항목을 제거한 다음, 두 번째 필드를 기준으로 중복 항목을 제거합니다. 그 예로 DISTINCT (name, assignee)인 경우 이 쿼리는 두 속성의 값이 서로 동일한 중복 항목만 제거합니다.
LIMIT
결과 컬렉션을 지정된 수만큼 제한하세요.

예시

쿼리 엔진의 정렬, 구분, 제한 연산자를 사용하여 'Ali'에게 배정된 할 일 항목을 찾을 수 있습니다.

  • 우선 순위를 기준으로 내림차순 정렬

  • 이름을 기준으로 고유성 적용

  • 5개 항목으로 결과 제한

"assignee == 'Ali' SORT(priority DESC) DISTINCT(name) LIMIT(5)"

앱에 인덱싱된 쿼리 가능 필드 를 추가하면 강력하게 분할된 데이터에 대한 간단한 쿼리의 성능을 향상시킬 수 있습니다. 예를 들어 user_id == $0, “641374b03725038381d2e1fb” 와 같이 쿼리가 데이터를 기기, 스토어 또는 사용자에 강력하게 매핑하는 앱은 인덱싱된 쿼리 가능 필드의 좋은 후보입니다. 그러나 인덱싱된 쿼리 가능 필드에는 쿼리 구독에 사용하기 위한 특정 요구 사항이 있습니다.

  • 인덱싱된 쿼리 가능 필드는 모든 구독 쿼리에서 사용해야 합니다. 쿼리에서 누락되어서는 안 됩니다.

  • 인덱싱된 쿼리 가능 필드는 구독 쿼리에서 상수에 대해 == 또는 IN 비교를 한 번 이상 사용해야 합니다. 예를 들어 user_id == $0, "641374b03725038381d2e1fb" 또는 store_id IN $0, {1,2,3}입니다.

인덱싱된 쿼리 가능 필드가 == 또는 IN을 사용하여 상수와 한 번 이상 직접 비교되는 경우, 선택적으로 AND 비교를 포함할 수 있습니다. 예를 들어 store_id IN {1,2,3} AND region=="Northeast" 또는 store_id == 1 AND (active_promotions < 5 OR num_employees < 10) 입니다.

인덱싱된 쿼리 가능 필드에 대한 유효하지 않은 Flexible Sync 쿼리에는 다음과 같은 쿼리가 포합됩니다.

  • 인덱싱된 쿼리 가능 필드가 AND를 나머지 쿼리와 함께 사용하지 않는 경우.예를 들어 store_id IN {1,2,3} OR region=="Northeast"AND 대신 OR을 사용하므로 유효하지않습니다. 마찬가지로 store_id == 1 AND active_promotions < 5 OR num_employees < 10AND가 전체 쿼리가 아니라 옆에 있는 용어에만 적용되므로 유효하지 않습니다.

  • 인덱싱된 쿼리 가능 필드가 동등 연산자에 사용되지 않는 경우.예를 들어 store_id > 2 AND region=="Northeast"> 연산자만 인덱싱된 쿼리 가능 필드에 사용하고 동등 비교는 없기 때문에 유효하지 않습니다.

  • 인덱싱된 쿼리 가능 필드가 쿼리에서 완전히 누락된 경우.예를 들어region=="Northeast 또는 truepredicate는 인덱싱된 쿼리 가능 필드를 포함하지 않으므로 유효하지 않습니다.

Flexible Sync는 RQL 연산자를 사용할 때 몇 가지 제한 사항이 있습니다. 동기화할 데이터를 결정하는 쿼리 구독 을 작성할 때 서버는 이러한 쿼리 연산자를 지원하지 않습니다. 그러나 전체 RQL 기능을 사용하여 클라이언트 애플리케이션에서 동기화된 데이터 세트를 쿼리할 수 있습니다.

연산자 유형
지원되지 않는 연산자
집계 연산자
@avg, @count, @max, @min, @sum
쿼리 접미사
DISTINCT, SORT, LIMIT

대소문자를 구분하지 않는 쿼리([c])은(는) 인덱스를 효과적으로 사용할 수 없습니다. 대소문자를 구분하지 않는 쿼리는 성능 문제를 일으킬 수 있으므로 사용하지 않는 것이 좋습니다.

Flexible Sync는 배열 필드에 대해 @count만 지원합니다.

Flexible Sync는 IN 연산자를 사용하여 목록 쿼리를 지원합니다.

상수 목록을 쿼리하여 쿼리 가능 필드 값이 포함되어 있는지 확인할 수 있습니다:

// Query a constant list for a queryable field value
"priority IN { 1, 2, 3 }"

쿼리 가능한 필드에 배열 값이 있는 경우 해당 에 상수 값이 포함되어 있는지 쿼리할 수 있습니다.

// Query an array-valued queryable field for a constant value
"'comedy' IN genres"

경고

Flexible Sync 쿼리에서는 두 목록을 비교하는 것이 불가능합니다. 이 구문은 Flexible Sync 쿼리 외에는 유효한 Realm Query Language 구문이라는 점에 유의하세요.

// Invalid Flexible Sync query. Do not do this!
"{'comedy', 'horror', 'suspense'} IN genres"
// Another invalid Flexible Sync query. Do not do this!
"ANY {'comedy', 'horror', 'suspense'} != ANY genres"

Flexible Sync는 내장된 객체 또는 링크의 속성에 대한 쿼리를 지원하지 않습니다. 예시: obj1.field == "foo"

구독 설정하다 에 있는 특정 쿼리 구독 의 크기 제한256 KB 입니다. 이 제한을 초과하면 LimitsExceeded 오류가 발생합니다.

돌아가기

스키마 수정