MongoDB 的 Grails 3 和 GORM 6 - 重复键错误
Grails 3 and GORM 6 for MongoDB - duplicated key error
环境:
- Grails 3.2.9
- GORM 6.1.2 用于 MongoDB3.4.2
这是我的(简化)域 class
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' - 不允许大写字母 -)正确触发验证。
没有将 id 映射到 slug
属性,因此保留默认的 assigned
逻辑,一切都按预期进行。
我错过了什么吗?提前致谢!
看来这实际上是一个错误,计划在即将发布的 GORM 版本 6.1.5 中修复。
参考。问题:https://github.com/grails/grails-data-mapping/issues/951
环境:
- Grails 3.2.9
- GORM 6.1.2 用于 MongoDB3.4.2
这是我的(简化)域 class
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' - 不允许大写字母 -)正确触发验证。
没有将 id 映射到 slug
属性,因此保留默认的 assigned
逻辑,一切都按预期进行。
我错过了什么吗?提前致谢!
看来这实际上是一个错误,计划在即将发布的 GORM 版本 6.1.5 中修复。
参考。问题:https://github.com/grails/grails-data-mapping/issues/951