Dem*_*ian 5 rest grails grails-orm mongodb objectid
Grails可以通过ID 轻松获取域对象(方便构建REST API).
用于检索资源的控制器可以如下所示:
MetricController.groovy
import grails.converters.JSON
class MetricController {
def index() {
def resource = Metric.get(params.id)
render resource as JSON
}
}
Run Code Online (Sandbox Code Playgroud)
使用MongoDB GORM(compile ":mongodb:1.2.0")的Grails插件时id,Long 需要将默认类型更改为type String或ObjectId.
Metric.groovy
import org.bson.types.ObjectId
class Metric {
static mapWith = "mongo"
ObjectId id
String title
}
Run Code Online (Sandbox Code Playgroud)
但是,做一个.get(1)遗嘱现在会导致:
Error 500: Internal Server Error
URI
/bow/rest/metric/1
Class
java.lang.IllegalArgumentException
Message
invalid ObjectId [1]
Run Code Online (Sandbox Code Playgroud)
我猜了一下并改变了控制器使用findById:
def resource = Metric.findById(new ObjectId(new Date(), params.id.toInteger()))
Run Code Online (Sandbox Code Playgroud)
这修复了错误,但无法找到对象(始终返回null).
例如,使用id"-1387348672"找不到此测试对象:
{ "class" : "Metric",
"id" : { "class" : "org.bson.types.ObjectId",
"inc" : -1387348672,
"machine" : 805582250,
"new" : false,
"time" : 1371329632000,
"timeSecond" : 1371329632
},
"title" : "Test"
}
Run Code Online (Sandbox Code Playgroud)
该ObjectId.inc字段甚至可能不是用于资源ID的正确字段.
那么,在使用MongoDB时,通过ID检索域对象的最简单方法是什么?
当域对象持久存储在 MongoDB 中时,它会存储为文档,其中ObjectId作为唯一的 12 字节 BSON 主键。例如,如果您有一个Product像这样的域对象
import org.bson.types.ObjectId
class Product {
ObjectId id
String name
static mapWith = "mongo"
}
Run Code Online (Sandbox Code Playgroud)
那么如果您使用名称“TestProduct”保存,MongoDB 中的持久实体将如下所示。
//db.product.find() in mongodb
{
"_id" : ObjectId("51bd047c892c8bf0b3a58b21"),
"name" : "TestProduct",
"version" : 0
}
Run Code Online (Sandbox Code Playgroud)
成为_id该文档的主键。对于get此文档,您需要主键 ObjectId。从 RESTful 上下文来看,您至少需要 12 字节十六进制代码51bd047c892c8bf0b3a58b21作为请求的一部分。
因此,在上述情况下,您可以通过执行类似的操作来获取该特定文档
Product.get(new ObjectId("51bd047c892c8bf0b3a58b21"))
Product.findById(new ObjectId("51bd047c892c8bf0b3a58b21"))
Run Code Online (Sandbox Code Playgroud)
查看ObjectId 的 API,它将清楚地说明如何检索文档。
当您以 JSON 形式检索文档时,它仅显示 ObjectId 类及其元素。
{
"class": "com.example.Product",
"id": {
"class": "org.bson.types.ObjectId",
"inc": -1280996575,
"machine": -1993569296,
"new": false,
"time": 1371341948000,
"timeSecond": 1371341948
},
"name": "TestProduct"
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4533 次 |
| 最近记录: |