领先一步
VMware 提供培训和认证,以加快您的进步。
了解更多去年,我们在 GORM 中引入了对 MongoDB 的支持(以及许多其他GORM实现),并受到了社区的热烈欢迎。我们收到了大量的反馈,今天我们很高兴地宣布一个新版本(里程碑 2)来解决我们收到的一些反馈。
嵌入式文档支持
最受请求的功能是嵌套文档支持,在这个版本中,我们对其进行了大幅改进。现在您可以使用 GORM 中标准的嵌入式映射来嵌入其他域。
class Person {
String firstName
String lastName
Address address
static embedded = ['address']
}
嵌入式域存储在主 Mongo 文档内的嵌套文档中。此外,基本类型的列表和映射现在也可以持久化为本机的 Mongo ArrayList 和哈希。
class Person {
List<String> friends
Map pets
}
...
new Person(friends:['Fred', 'Bob'], pets:[chuck:"Dog", eddie:'Parrot']).save(flush:true)
嵌入式域以及列表和映射都存储在域的主 Mongo 文档中,允许使用 GORM 实现更多常见的 MongoDB 模式。
地理空间索引和查询
MongoDB 原生支持地理空间索引和查询,GORM for MongoDB 现在也支持此功能。您可以将列表或映射定义为“地理索引”。
class Hotel {
String name
List location
static mapping = {
location geoIndex:true
}
}
然后可以使用表示经度和纬度的二维列表轻松持久化地理数据。
new Hotel(name:"Hilton", location:[50, 50]).save()
或者,可能更易读的方法是使用包含经度和纬度值的映射。
new Hotel(name:"Hilton", location:[lat: 40.739037, long: 73.992964]).save()
持久化后,可以使用新的 findBy*Near 语法查询域类。
def h = Hotel.findByLocationNear([50, 60])
assert h.name == 'Hilton'
您还可以使用绑定查询来查找矩形内的位置,方法是使用 findBy*WithinBox 方法。
def box = [[40.73083, -73.99756], [40.741404, -73.988135]]
def h = Hotel.findByLocationWithinBox(box)
或者使用 findBy*WithinCircle 方法在圆圈内查找。
def center = [50, 50]
def radius = 10
def h = Hotel.findByLocationWithinCircle([center, radius])
无模式域模型
MongoDB 完全无模式,这意味着您不像在关系数据库中那样受到固定列数的限制。GORM for MongoDB 现在支持无模式域模型。您可以继续在域模型中指定您的固定域属性。
class Plant {
boolean goesInPatch
String name
}
但是,您现在也可以使用 Groovy 下标运算符持久化其他属性。
def p = new Plant(name:"Pineapple")
p['color'] = 'Yellow'
p['hasLeaves'] = true
p.save()
p = Plant.findByName("Pineapple")
println p['color']
println p['hasLeaves']
还有许多其他改进,包括能够自定义索引创建、支持按示例查询以及对 GORM API 的更完整支持。文档已更新,涵盖了所有这些新功能。请告诉我们您的想法,您的反馈对我们非常宝贵。
最后一点,如果您在马德里地区,并且想了解更多关于 GORM for MongoDB 的信息,请在本周四参加Spring IO 大会,届时将会有更多关于 Spring、Grails 和 GORM 的演讲。