領先一步
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 的講座。