구독 및 권한을 사용하여 앱과 동기화할 데이터를 결정합니다. 이 페이지에서는 Flexible Sync에 대한 구독을 managed하는 방법에 대해 자세히 설명합니다.
자세한 내용은 App Services 문서에서 Flexible Sync 를 참조하세요.
전제 조건
Realm Mobile Sync 구독으로 작업하려면 먼저 Realm Mobile Sync를 사용하도록 앱을 설정하고 백엔드에서 Flexible Sync를 구성해야 합니다.
이렇게 하려면 앱에 Realm Mobile Sync 추가 절차에 설명된 단계를 완료합니다.
구독 개요
백엔드에서 Flexible Sync를 구성할 때 클라이언트 애플리케이션이 구독을 사용하여 쿼리할 수 있는 필드를 지정합니다.
각 구독은 특정 객체 유형에 대한 쿼리 가능 필드 에 대한 쿼리에 해당합니다. 자세한 내용은 Atlas App Services 문서에서 쿼리 가능 필드 를 참조하세요.
각 쿼리 구독에 대해 Realm은 쿼리와 일치하는 데이터를 찾습니다. 사용자가 적절한 권한을 가진 구독과 일치하는 데이터는 클라이언트와 백엔드 애플리케이션 간에 동기화됩니다.
중요
Flexible Sync 는 RQL에서 사용할 수 있는 모든 연산자를 지원하지 않습니다. 자세한 내용은 Flexible Sync RQL 제한 사항 을 참조하세요.
객체 유형 구독
구독 세트는 객체 유형을 기반으로 합니다. 여러 유형의 Realm 객체가 있는 경우 여러 개의 구독이 있을 수 있습니다. 동일한 객체 유형에 대해 여러 개의 구독을 가질 수도 있습니다.
그러나 앱에서 연결된 객체, 비대칭 객체 또는 지리 공간적 데이터 를 사용하는 경우 다음 섹션에서 추가 정보를 확인하세요.
연결된 객체
앱에서 연결된 객체 를 사용하는 경우 객체 자체와 연결된 객체를 모두 구독 세트에 추가 해야 실제 연결된 객체를 볼 수 있습니다.
구독 결과에 포함되지 않은 객체에 연결되는 속성을 가진 객체가 포함된 경우 해당 링크는 null로 표시됩니다. 해당 속성 값이 null인지, 아니면 링크된 객체가 존재하지만 쿼리 구독의 표시 영역에서 벗어난 것인지 구분할 방법이 없습니다.
비대칭 객체
앱에서 Data Ingest를 사용하여 비대칭 객체를 단방향으로 동기화하는 경우 해당 객체에 대한 구독을 만들 수 없습니다. 앱의 동일한 영역에 비대칭 객체와 그렇지 않은 객체가 있는 경우, 비대칭 객체에 대한 Flexible Sync 구독 쿼리를 추가할 수 있습니다.
지리 공간 데이터
버전 1.13.0에서 변경됨 : Atlas Device Sync에서 지원되는 지리 공간적 데이터
Kotlin SDK 버전 1.13.0 이상에서는 지리 공간적 쿼리에 대한 구독을 만들 수 있습니다. 이전 버전의 SDK에서 지리 공간적 쿼리를 구독하려고 하면 보정용 쓰기와 함께 서버 오류가 발생합니다.
자세한 내용은 지리 공간적 데이터 쿼리를 참조하세요.
초기 구독
영역에서 읽거나 영역에 쓰려면 먼저 구독이 하나 이상 있어야 합니다.
클라이언트 앱에서 구독 관리하기
클라이언트 애플리케이션에서 쿼리 가능 필드의 특정 쿼리에 대한 구독을 추가, 업데이트 및 제거합니다. 이에 따라 클라이언트 장치에 동기화할 데이터가 결정됩니다.
다음을 수행할 수 있습니다.
선택 사항인 구독 이름을 사용하여 구독을 추가합니다:
Kotlin SDK 버전 1.10.0 이상에서는
.subscribe()
을(를) 사용하여RealmQuery
또는RealmResults
을(를) 구독할 수 있습니다. 이렇게 하면 자동으로 구독 세트에 구독이 추가됩니다.subscriptions
API를 사용하여 구독 세트에 수동으로 구독을 추가합니다. 성능 최적화 또는 비즈니스 로직상의 이유로 구독에 대한 더 많은 제어가 필요한 경우 이 API를 사용하세요. 자세한 내용은 성능 고려 사항 섹션을 참조하세요.
구독 상태에 React
새 쿼리로 구독 업데이트
객체 유형에 대한 개별 구독 또는 모든 구독 제거
해당 페이지의 예제에 대한 정보
이 페이지의 예제에서는 작업 목록 앱의 데이터 세트를 사용합니다.
두 가지 Realm 객체 유형은 Team
및 Task
입니다.
class Task : RealmObject { var _id: ObjectId = ObjectId() var taskName: String = "" var assignee: String? = null var completed: Boolean = false var progressMinutes: Int = 0 var dueDate: RealmInstant? = null } class Team : RealmObject { var _id: ObjectId = ObjectId() var teamName: String = "" var tasks: RealmList<Task>? = realmListOf() var members: RealmList<String> = realmListOf() }
또한 이 페이지의 예제에서는 권한이 부여된 사용자와 Flexible Sync SyncConfiguration()이 있다고 가정합니다.
// Login with authorized user and define a Flexible Sync SyncConfiguration val app = App.create(YOUR_APP_ID) val user = app.login(credentials) val flexSyncConfig = SyncConfiguration.Builder(user, setOf(Task::class, Team::class)) .initialSubscriptions { // Define the initial subscription set for the realm ... } .build() // Open the synced realm and manage subscriptions val realm = Realm.open(flexSyncConfig) Log.v("Successfully opened realm: ${realm.configuration}")
쿼리 구독
버전 1.10.0의 새로운 기능.
구독 관리 를 간소화하기 위해 Realm 코틀린 SDK (Kotlin SDK) 버전 1.10.0 은(는) 실험적 을(를) 추가합니다 . 구독() RealmQuery
또는 RealmResults
설정하다 를 구독 하는 API 입니다. 이 API 는 구독 세트를 통해 수동으로 구독을 추가하고 제거하는 세부 정보를 추상화합니다.
다음을 수행할 수 있습니다.
선택적 이름으로 쿼리 자동 구독
새 쿼리로 명명된 구독 업데이트
성능 최적화 또는 비즈니스 로직상의 이유로 구독에 대한 더 많은 제어가 필요한 경우 subscriptions
API를 사용하여 구독 세트를 수동으로 관리 할 수 있습니다. 자세한 내용은 성능 고려 사항 섹션을 참조하세요.
쿼리 구독
쿼리에 .subscribe()
을 사용하여 특정 쿼리와 일치하는 객체에 대한 구독을 만들 수 있습니다.
// Subscribe to a specific query val realmResults = realm.query<Task>("progressMinutes >= $0", 60) .subscribe() // Subscribe to all objects of a specific type val realmQuery = realm.query<Team>() realmQuery.subscribe()
이렇게 하면 구독 설정하다 에 수동으로 구독 을 추가 할 필요 없이 명명되지 않은 구독 이 생성되어 MutableSubscriptionSet
에 추가됩니다.
이름으로 쿼리 구독하기
앱 이 여러 개의 구독과 함께 작동하거나 구독 을 업데이트 하려는 경우 쿼리 를 구독 할 때 이름을 추가할 수 있습니다. 나중에 이 이름을 사용하여 구독의 쿼리 를 업데이트 하거나 이름으로 쿼리 를 제거 할 수 있습니다.
구독에 이름을 추가하려면 .subscribe()
호출 시 문자열을 전달합니다.
// Add a subscription named "team_developer_education" val results = realm.query<Team>("teamName == $0", "Developer Education") .subscribe("team_developer_education")
쿼리 구독 업데이트
updateExisting
을 true
로 설정하여 명명된 쿼리 구독을 새 쿼리로 업데이트할 수 있습니다.
// Create a subscription named "bob_smith_teams" val results = realm.query<Team>("$0 IN members", "Bob Smith") .subscribe("bob_smith_teams") // Add another subscription with the same name with `updateExisting` set to true // to replace the existing subscription val updateResults = realm.query<Team>("$0 IN members AND teamName == $1", "Bob Smith", "QA") .subscribe("bob_smith_teams", updateExisting = true)
이렇게 하면 구독 설정하다 에서 수동으로 구독 을 업데이트 할 필요 없이 자동으로 구독 을 업데이트할 수 있습니다.
쿼리 구독이 동기화될 때까지 기다리기
쿼리의 결과 세트를 구독하는 경우 해당 세트는 동기화될 때까지 객체를 포함하지 않습니다. 앱에서 객체를 생성하는 경우 사용자가 작업하기 전에 동기화된 데이터를 다운로드할 필요가 없을 수 있습니다. 그러나 앱이 사용자가 작업하기 전에 서버의 데이터가 필요한 경우에는 데이터가 동기화될 때까지 앱이 대기하도록 지정할 수 있습니다. 이렇게 하면 서버에서 데이터가 동기화될 때까지 앱 실행이 차단됩니다.
val results = realm.query<Team>("$0 IN members", "Bob Smith") .subscribe("bob_smith_teams", updateExisting = false, WaitForSync.ALWAYS) // After waiting for sync, the results set contains all the objects // that match the query - in our case, 1 println("The number of teams that have Bob Smith as a member is ${results.size}")
이 옵션은 값이 다음과 같은 WaitForSync 열거형 을 사용합니다.
FIRST_TIME
: (기본값) 앱이 처음에 구독을 생성할 때 일치하는 객체를 다운로드할 때까지 기다립니다. 그렇지 않으면 새 다운로드를 기다리지 않고 돌아갑니다. 구독을 처음 추가할 때 데이터를 다운로드하려면 앱이 인터넷에 연결되어 있어야 합니다. 선택적으로timeout
값을 지정할 수 있습니다.ALWAYS
:.subscribe()
메서드가 호출될 때마다 일치하는 객체를 다운로드할 때까지 기다립니다. 데이터를 다운로드하려면 앱이 인터넷에 연결되어 있어야 합니다. 선택적으로timeout
값을 지정할 수 있습니다.NEVER
: 일치하는 객체를 다운로드하기 위해 기다리지 마세요. 앱을 처음 실행할 때는 사용자가 인증하기 위해 인터넷 연결이 필요하지만 이후 실행 시 캐시된 자격 증명을 사용하여 오프라인에서 열 수 있습니다.
수동으로 구독 관리하기
클라이언트 애플리케이션에서 subscriptions
API를 사용하여 구독 세트를 managed로 관리합니다. 이 API를 사용하면 쿼리 가능한 필드에 대한 특정 쿼리를 추가, 업데이트 또는 제거할 수 있습니다. 이러한 쿼리는 클라이언트 장치에 동기화할 데이터를 결정합니다.
코틀린 SDK (Kotlin SDK) 버전 1.10.0 이상에서는 . 구독() API. 이 API 는 RealmQuery
또는 RealmResults
에서 직접 MutableSubscriptionSet
에 대한 구독을 추가합니다.
구독 추가
명명되지 않은 구독 또는 명명된 구독을 추가할 수 있습니다.
팁
구독 이름 지정
애플리케이션에서 여러 개의 구독을 사용하는 경우 항상 구독 이름을 지정합니다. 이렇게 하면 앱의 다른 곳에서 구독을 더 쉽게 조회, 업데이트 및 삭제할 수 있습니다.
수동으로 구독을 생성하려면 구독 업데이트 블록에 구독을 추가합니다. 클라이언트의 Realm 구독에 각각의 새 구독을 추가합니다.
realm.subscriptions.update { add( realm.query<Task>("progressMinutes >= $0",60) ) }
구독을 만들 때 구독 이름을 지정할 수도 있습니다.
// Add a subscription named "team_dev_ed" realm.subscriptions.update { realm -> add( realm.query<Team>("teamName == $0", "Developer Education"), name = "team_dev_ed" ) }
중요
객체 링크
링크된 객체를 보려면 객체와 해당 링크된 객체를 모두 구독 세트에 추가해야 합니다.
구독 결과에 포함되지 않은 객체에 연결되는 속성을 가진 객체가 포함된 경우 해당 링크는 null로 표시됩니다. 해당 속성 값이 null인지, 아니면 링크된 객체가 존재하지만 구독 누락으로 인해 클라이언트가 사용할 수 없는지 여부를 구분할 방법이 없습니다.
초기 구독으로 Realm 부트스트랩
Realm에서 읽거나 영역 에 쓰기 (write) 려면 먼저 구독 이 하나 이상 있어야 합니다. 영역 () 을 사용하여 Realm을 열 때 초기 구독 설정하다 가 있는 Realm을 부트스트랩할 수 있습니다. 자세한 내용 은 동기화된 Realm 열기 를 참조하세요.
영역을 부트스트랩하는 데 사용할 구독 쿼리와 함께 initialSubscriptions
매개 변수를 전달합니다.
// Bootstrap the realm with an initial query to subscribe to val flexSyncConfig = SyncConfiguration.Builder(user, setOf(Team::class, Task::class)) .initialSubscriptions { realm -> add( realm.query<Team>("$0 IN members", "Bob Smith"), "bob_smith_teams" ) } .build()
앱이 시작될 때마다 이 초기 구독을 다시 실행해야 하는 경우 추가 매개변수 rerunOnOpen
를 전달할 수 있습니다. 이는 앱이 시작될 때마다 초기 구독을 다시 실행할지 여부를 나타내는 부울입니다. 동적 시간 범위 또는 구독에 대한 정적 변수를 다시 계산해야 하는 기타 쿼리를 다시 실행하려면 이 작업을 수행해야 할 수 있습니다.
이 예제에서는 불완전한 작업만 원합니다. rerunOnOpen
을 true
로 설정하면 쿼리는 앱이 시작될 때마다 원하는 쿼리 결과를 기반으로 동기화할 관련 객체를 동적으로 다시 계산합니다.
// `rerunOnOpen` lets the app recalculate this query every time the app opens val rerunOnOpenConfig = SyncConfiguration.Builder(user, setOf(Team::class, Task::class)) .initialSubscriptions(rerunOnOpen = true) { realm -> add( realm.query<Team>("completed == $0", false) ) } .build()
구독 변경 사항이 Sync될 때까지 기다리기
로컬에서 구독 세트에 업데이트를 기록하는 것은 구독 변경의 한 구성 요소일 뿐입니다. 로컬 구독 변경 후 클라이언트는 서버와 동기화하여 구독 변경으로 인한 데이터 업데이트를 해결합니다. 이는 동기화된 realm에서 데이터를 추가하거나 제거하는 것을 MEAN 수 있습니다.
SyncConfiguration.waitForInitialRemoteData() 빌더 메서드를 사용하여 영역 을 열기 전에 클라이언트 구독 데이터가 백엔드 와 동기화될 때까지 애플리케이션 을 강제로 차단 수 있습니다.
// Update the list of subscriptions realm.subscriptions.update { add( realm.query<Team>("$0 IN members", "Jane Doe"), "jane_doe_teams" ) } // Wait for subscription to fully synchronize changes realm.subscriptions.waitForSynchronization(Duration.parse("10s"))
동기화 연결을 인스턴스화한 후 구독 동기화 가 완료될 때까지 SubscriptionSet.waitForSynchronization() 을 사용하여 실행을 지연할 수도 있습니다.
구독 세트 상태
구독 세트의 현재 상태를 읽으려면 SubscriptionSet.state 속성을 사용하세요.
SUPERCEDED
(sic -- 대체 철자법 참고)는 다른 스레드가 구독 세트의 다른 인스턴스에 구독을 쓸 때 발생할 수 있는 SubscriptionSetState 입니다. 상태가 SUPERCEDED
이 되면 구독 세트의 새 인스턴스를 가져와야 구독 세트에 쓸 수 있습니다.
참고
구독 상태 "완료"
구독 세트 상태 "완료" 는 "동기화가 완료됨" 또는 "모든 문서가 동기화됨" 을 의미하지 않습니다. "완료" 는 다음 두 가지를 의미합니다:
구독이 현재 서버와 동기화되고 있는 활성 구독 세트가
이제 구독이 서버로 전송될 때 구독과 일치했던 문서가 로컬 장치에 존재합니다. 여기에는 현재 구독과 일치하는 모든 문서가 반드시 포함되는 것은 아닙니다.
Realm SDK는 구독과 일치하는 모든 문서가 기기에 동기화되었는지 확인하는 방법을 제공하지 않습니다.
새 쿼리로 구독 업데이트하기
SubscriptionSet를 사용하여 구독을 업데이트 할 수 있습니다 . 업데이트().
이 예제에서는 MutableSubscriptionSet.add() 를 사용합니다. "bob_smith_teams"
이라는 구독에 대한 쿼리를 업데이트합니다. add()
으)로 구독을 업데이트하려면 updateExisting
매개 변수를 true
으)로 설정해야 합니다.
// Create a subscription named "bob_smith_teams" realm.subscriptions.update { add( realm.query<Team>("$0 IN members", "Bob Smith"), "bob_smith_teams" ) } // Set `updateExisting` to true to replace the existing // "bob_smith_teams" subscription realm.subscriptions.update { add( realm.query<Team>("$0 IN members AND $1 IN members", "Bob Smith", "Jane Doe"), "bob_smith_teams", updateExisting = true ) }
이름 없이 생성된 구독은 업데이트할 수 없습니다. 그러나 쿼리로 이름이 지정되지 않은 구독을 조회하고 구독 세트에서 제거한 다음 업데이트된 쿼리로 새 구독을 추가할 수 있습니다.
// Search for the subscription by query val subscription = realm.subscriptions.findByQuery( realm.query<Team>("teamName == $0", "Developer Education") ) // Remove the returned subscription and add the updated query if (subscription != null) { realm.subscriptions.update { remove(subscription) add( realm.query<Team>("teamName == $0", "DevEd"), "team_developer_education" ) } }
구독 제거
구독을 제거하려면 다음과 같이 하세요:
단일 구독 쿼리 제거
특정 객체 유형에 대한 모든 구독을 제거합니다.
모든 구독 삭제
이름 없는 모든 구독 제거
구독 쿼리를 제거하면 Realm은 클라이언트 장치에서 쿼리와 일치하는 동기화된 데이터를 비동기적으로 제거합니다.
단일 구독 제거
MutableSubscriptionSet.remove() 를 사용하여 특정 구독 쿼리를 제거할 수 있습니다. 이름으로 구독을 조회한 다음 반환된 구독을 remove()
에 전달하거나 구독 이름을 remove()
에 직접 전달할 수 있습니다.
realm.subscriptions.update { add( realm.query<Team>("$0 IN members", "Bob Smith"), "bob_smith_teams" ) } // Wait for synchronization to complete before updating subscriptions realm.subscriptions.waitForSynchronization(Duration.parse("10s")) // Remove subscription by name realm.subscriptions.update { remove("bob_smith_teams") }
객체 유형에 대한 모든 구독 제거하기
특정 객체 유형에 대한 모든 구독을 제거 하려면 MutableSubscriptionSet.removeAll() 클래스를 전달합니다. 메서드:
realm.subscriptions.update { add( realm.query<Team>("$0 IN members", "Bob Smith"), "bob_smith_teams") } // Wait for synchronization to complete before updating subscriptions realm.subscriptions.waitForSynchronization(Duration.parse("10s")) // Remove all subscriptions to type Team realm.subscriptions.update { removeAll(Team::class) }
모든 구독 제거
구독 설정하다 에서 모든 구독을 제거 하려면 MutableSubscriptionSet.removeAll() 을 사용합니다. 인수 없이:
경고
모든 구독을 제거하고 새 구독을 추가하지 않으면 오류가 발생합니다. flexible sync 구성으로 열린 영역의 경우, 서버와 동기화하려면 하나 이상의 구독이 필요합니다.
// Remove all subscriptions realm.subscriptions.update { removeAll() }
이름 없는 모든 구독 제거
버전 1.10.0의 새로운 기능.
일시적이거나 동적으로 생성된 이름 없는 구독을 제거하고 이름이 지정된 구독은 그대로 두는 것이 좋습니다.
removeAll
메서드를 호출할 때 anonymousOnly
을(를) true
(으)로 설정하여 구독 세트에서 명명되지 않은 모든(익명) 구독을 제거할 수 있습니다.
// Remove all unnamed (anonymous) subscriptions realm.subscriptions.update { removeAll(anonymousOnly = true) }
Flexible Sync RQL 요구 사항 및 제한 사항
인덱싱된 쿼리 가능 필드 구독 요구 사항
앱에 인덱싱된 쿼리 가능 필드 를 추가하면 강력하게 분할된 데이터에 대한 간단한 쿼리의 성능을 향상시킬 수 있습니다. 예를 들어 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 < 10
는AND
가 전체 쿼리가 아니라 옆에 있는 용어에만 적용되므로 유효하지 않습니다.인덱싱된 쿼리 가능 필드가 동등 연산자에 사용되지 않는 경우.예를 들어
store_id > 2 AND region=="Northeast"
는>
연산자만 인덱싱된 쿼리 가능 필드에 사용하고 동등 비교는 없기 때문에 유효하지 않습니다.인덱싱된 쿼리 가능 필드가 쿼리에서 완전히 누락된 경우.예를 들어
region=="Northeast
또는truepredicate
는 인덱싱된 쿼리 가능 필드를 포함하지 않으므로 유효하지 않습니다.
Flexible Sync에서 지원되지 않는 쿼리 연산자
Flexible Sync는 RQL 연산자를 사용할 때 몇 가지 제한 사항이 있습니다. 동기화할 데이터를 결정하는 쿼리 구독 을 작성할 때 서버는 이러한 쿼리 연산자를 지원하지 않습니다. 그러나 전체 RQL 기능을 사용하여 클라이언트 애플리케이션에서 동기화된 데이터 세트를 쿼리할 수 있습니다.
연산자 유형 | 지원되지 않는 연산자 |
---|---|
집계 연산자 |
|
쿼리 접미사 |
|
대소문자를 구분하지 않는 쿼리([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 오류가 발생합니다.
성능 고려 사항
API 효율성
쿼리 구독 섹션에 설명된 .subscribe()
API를 사용하여 여러 구독을 관리하는 것은 구독 세트 API를 통해 구독을 수동으로 관리할 때 배치 업데이트를 수행하는 것보다 효율성이 떨어집니다. 구독을 여러 번 변경할 때 성능을 향상하려면 수동으로 구독 관리 섹션에 설명된 subscriptions.update
API를 사용하세요.
성능 향상을 위한 그룹 업데이트
구독 세트에 대한 모든 쓰기 트랜잭션(write transaction)에는 성능이 소모됩니다. 세션 중에 영역 객체를 여러 번 업데이트해야 하는 경우 모든 변경이 완료될 때까지 편집한 객체를 메모리에 보관하는 것이 좋습니다. 이렇게 하면 모든 변경 사항 대신 완전하고 업데이트된 객체만 영역에 기록하므로 동기화 성능이 향상됩니다.