MongoDB的Grails 3和GORM 6 - 重复的密钥错误

时间:2017-05-16 14:58:05

标签: mongodb grails gorm grails3

环境:

  • Grails 3.2.9
  • MongoDB 3.4.2的GORM 6.1.2

这是我的(简化)域类

class Cluster {

    String name
    String slug

    static constraints = {
        name        blank: false, unique: true
        slug        blank: false, unique: true, validator: { return it == it.toLowerCase().replaceAll(/[^\w-]/, '') }
    }

    static mapping = {
        collection 'Cluster'
        id name: 'slug'
    }

}

如您所见,我将slug属性映射为文档_id

我可以使用

成功添加文档
Cluster cluster = new Cluster(name: 'Dallas', slug: 'dal05')
cluster.insert(failOnError: true)

一切正常。但是如果我再次执行相同的insert命令,我会得到一个重复的密钥异常:

com.mongodb.MongoBulkWriteException: Bulk write operation error on server localhost:27017. Write errors: [BulkWriteError{index=0, code=11000, message='E11000 duplicate key error index: db.Cluster.$_id_ dup key: { : "dal05" }', details={ }}]

虽然我本来期望一个简单的验证错误,说明重复的密钥。

但是,虽然unique约束失败,但是对于其他两个约束(空值或例如'Dal05' - 不允许的大写字母)正确触发验证。

如果不在slug属性上映射id,那么保留默认的assigned逻辑,一切都按预期工作。

我错过了什么吗?提前谢谢!

1 个答案:

答案 0 :(得分:0)

这似乎是一个错误,计划在即将推出的GORM版本6.1.5中修复。

参考。问题:https://github.com/grails/grails-data-mapping/issues/951