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

修复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"
          }
        }
      }
      
  • 确认配置生效:修改完Schema、权限规则后,必须点击Atlas App Services控制台的部署按钮,将草稿配置发布到线上环境,否则所有修改不会实际生效。
  • 校验服务名:确认代码中getMongoClient()传入的服务名,和控制台关联的MongoDB集群服务名完全一致,默认服务名为mongodb-atlas,如果自定义过服务名需要同步修改代码中的传参。

内容的提问来源于stack exchange,提问作者Besart

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 02:27:20