Grails упрощает до get объект домена по ID (удобен для создания REST API).GORM получить/найти ресурс по ID используя MongoDB в Grails
Контроллер для извлечения ресурса может быть столь же просто, как:
MetricController.groovy
import grails.converters.JSON
class MetricController {
def index() {
def resource = Metric.get(params.id)
render resource as JSON
}
}
При использовании плагин Grails для MongoDB GORM (compile ":mongodb:1.2.0"
), тип по умолчанию id
от Long
needs to be changed до типа String
или ObjectId
.
Metric.groovy
import org.bson.types.ObjectId
class Metric {
static mapWith = "mongo"
ObjectId id
String title
}
Однако делать .get(1)
теперь будет приводить:
Error 500: Internal Server Error
URI
/bow/rest/metric/1
Class
java.lang.IllegalArgumentException
Message
invalid ObjectId [1]
Я принял догадку и изменил контроллер использовать findById
:
def resource = Metric.findById(new ObjectId(new Date(), params.id.toInteger()))
Это исправило ошибку, но не удалось найти объект (всегда возвращает null).
Например, используя идентификатор «-1387348672» не находит этот тестовый объект:
{ "class" : "Metric",
"id" : { "class" : "org.bson.types.ObjectId",
"inc" : -1387348672,
"machine" : 805582250,
"new" : false,
"time" : 1371329632000,
"timeSecond" : 1371329632
},
"title" : "Test"
}
ObjectId.inc
поля не может даже быть правильным полем использовать для идентификатора ресурса.
Итак, что является самым простым способом получить объект домена по ID при использовании MongoDB?
Зная, что идентификатор должен быть ключ шестигранный BSON 12-байтовый получил меня в правильном направлении. Оказалось, что довольно легко создавать строки идентификаторов из ObjectIDs ... просто используйте '.toString()'. И затем вы можете передать строку ID непосредственно в '.get()', если строка идентификатора отформатирована правильно ('[0-9a-f] {24}'). –