You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MongoDB Realm调用findAll查询返回记录数不符预期问题

问题根因

你拿到Realm实例后立刻发起查询的写法存在逻辑问题:分区同步是后台异步执行的,Realm.getInstance()返回实例的节点,不代表对应分区的服务端数据已经全部下载到本地。此时你查询到的只是已经同步完成的部分数据,所以每次运行得到的结果数不稳定,且始终小于服务端实际的25000条总量。

修复方法
  • 给同步配置加上waitForInitialRemoteData()配置,让Realm打开实例前先等待该分区的全量初始数据同步完成,再返回实例给业务逻辑调用,修改后的代码如下:
val employeeRealmConfig = SyncConfiguration.Builder(
    realmApp.currentUser()!!,
    AppConfigs.MONGODB_REALM_USER_PARTITION_ID
)
    .waitForInitialRemoteData()
    .build()
// 该方法会阻塞等待全量初始同步完成后再返回实例
backGroundRealm = Realm.getInstance(employeeRealmConfig)
// 此时本地已存全量分区数据,查询结果为完整的25000条员工记录
val queryEmployeesTask = backGroundRealm.where<Employee>().findAll()
  • 如果不希望打开Realm时阻塞等待,可以给同步会话注册下载进度监听器,等全量数据下载完成的回调触发后再执行查询逻辑:
backGroundRealm = Realm.getInstance(employeeRealmConfig)
backGroundRealm.syncSession.addDownloadProgressListener(ProgressMode.INDEFINITELY) { progress ->
    if (progress.transferredBytes == progress.transferableBytes) {
        // 全量数据下载完成,执行查询
        val allEmployees = backGroundRealm.where<Employee>().findAll()
    }
}
  • 补充排查项:如果加了上述配置后还是拿不到全量数据,打开Realm的debug级别日志,核查是否存在Employee实体类字段和服务端文档不匹配、必填字段缺失、权限不足的问题,这类问题会导致部分文档被同步规则拦截,无法落到本地Realm中。

内容的提问来源于stack exchange,提问作者Zappy.Mans

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 01:39:34