修复Kotlin Realm SDK接入MongoDB的ARGUMENTS_NOT_ALLOWED错误
Kotlin + Realm SDK 插入MongoDB文档报insert not permitted问题排查
问题现象
基于Kotlin Jetpack Compose开发Android应用,采用MongoDB存储业务数据,通过MongoClient访问数据库执行数据写入操作时,插入Document触发如下错误:
Error: ARGUMENTS_NOT_ALLOWED(realm::app::ServiceError:13) : insert not permitted
核心实现代码
用户登录与文档插入逻辑:
Realm.init(this) val appID : String = "my-app-id"; app = App( AppConfiguration.Builder(appID) .build()) app?.loginAsync(Credentials.emailPassword(email, password)) { if (it.isSuccess) { val user: User? = app?.currentUser() val client = user?.getMongoClient("mongodb-atlas") val db = client?.getDatabase("tracker") val coll = db?.getCollection("User") val doc = Document("_id", UUID.randomUUID().toString()).append("name", "Besart") coll?.insertOne(doc)?.getAsync { if(it.isSuccess){ // 插入成功逻辑 }else{ Log.e("ERROR", "${it.error.errorCode}") it.error.printStackTrace() } } } else { Log.e("ERROR", "Failed to log in. Error: ${it.error}") } }
User集合Schema配置:
{ "title": "User", "properties": { "_id": { "bsonType": "objectId" }, "name": { "bsonType": "string" } } }
已为当前登录账号配置数据库全量访问权限,但插入操作仍被拦截报错。
根因分析
该错误核心触发原因是插入的文档不符合集合Schema约束,被Atlas App Services的校验规则拦截,和账号权限无直接关联:
代码中插入文档的_id字段值为UUID.randomUUID().toString()生成的字符串类型,但Schema中明确定义_id的bsonType为objectId,类型不匹配直接触发插入拦截。
另外两个常见配置遗漏点也会触发同类错误:
- 修改完权限/Schema规则后未发布草稿,配置未在线上生效
- 代码中传入的MongoDB服务名和控制台配置的服务名不匹配
修复方案
按以下步骤逐一排查修复即可:
- 修复
_id字段类型不匹配问题,二选一即可:- 方案1:修改代码侧
_id生成逻辑,使用ObjectId类型作为主键,替换文档生成代码为:import org.bson.types.ObjectId val doc = Document("_id", ObjectId()).append("name", "Besart") - 方案2:修改集合Schema配置,将
_id的bsonType改为string,适配现有UUID字符串主键逻辑,修改后Schema如下:{ "title": "User", "properties": { "_id": { "bsonType": "string" }, "name": { "bsonType": "string" } } }
- 方案1:修改代码侧
- 确认配置生效:修改完Schema、权限规则后,必须点击Atlas App Services控制台的部署按钮,将草稿配置发布到线上环境,否则所有修改不会实际生效。
- 校验服务名:确认代码中
getMongoClient()传入的服务名,和控制台关联的MongoDB集群服务名完全一致,默认服务名为mongodb-atlas,如果自定义过服务名需要同步修改代码中的传参。
内容的提问来源于stack exchange,提问作者Besart
相关产品推荐
相关产品推荐

