gpt4 book ai didi

mongodb - GORM 在 Grails 中使用 MongoDB 按 ID 获取/查找资源

转载 作者:IT老高 更新时间:2023-10-28 13:35:35 26 4
gpt4 key购买 nike

Grails 使 get 变得容易按 ID 的域对象(便于构建 REST API)。

检索资源的 Controller 可以很简单:

MetricController.groovy

import grails.converters.JSON

class MetricController {

def index() {
def resource = Metric.get(params.id)
render resource as JSON
}

}


当使用 MongoDB GORM 的 Grails 插件时(compile ":mongodb:1.2.0"),默认的 id 类型为 Long needs to be changed键入 StringObjectId

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]


我猜测了一下,将 Controller 更改为使用 findById:

def resource = Metric.findById(new ObjectId(new Date(), params.id.toInteger()))

修复了错误,但找不到对象(始终返回 null)。

例如使用“-1387348672”的id找不到这个测试对象:

{ "class" : "Metric",
"id" : { "class" : "org.bson.types.ObjectId",
"inc" : -1387348672,
"machine" : 805582250,
"new" : false,
"time" : 1371329632000,
"timeSecond" : 1371329632
},
"title" : "Test"
}


ObjectId.inc 字段甚至可能不是用于资源 ID 的正确字段。

那么,在使用 MongoDB 时,通过 ID 检索域对象的最简单方法是什么?

最佳答案

当域对象被持久化在 MongoDB 中时,它被存储为带有 ObjectId 的文档。作为唯一的 12 字节 BSON 主键。例如,如果您有一个域对象 Product

import org.bson.types.ObjectId
class Product {
ObjectId id
String name

static mapWith = "mongo"
}

如果您将名称保存为“TestProduct”,那么 MongoDB 中的持久化实体将如下所示。

//db.product.find() in mongodb
{
"_id" : ObjectId("51bd047c892c8bf0b3a58b21"),
"name" : "TestProduct",
"version" : 0
}

_id 成为该文档的主键。要get此文档,您需要主键 ObjectId。从 RESTful 上下文来看,您至少需要 12 个字节的十六进制代码 51bd047c892c8bf0b3a58b21 作为请求的一部分。

因此,在上述情况下,您可以通过执行类似的操作来获取该特定文档

Product.get(new ObjectId("51bd047c892c8bf0b3a58b21"))
Product.findById(new ObjectId("51bd047c892c8bf0b3a58b21"))

看看API for ObjectId这将明确如何检索文档。

当您以 JSON 格式检索文档时,它只显示 ObjectId 类及其元素。

{
"class": "com.example.Product",
"id": {
"class": "org.bson.types.ObjectId",
"inc": -1280996575,
"machine": -1993569296,
"new": false,
"time": 1371341948000,
"timeSecond": 1371341948
},
"name": "TestProduct"
}

关于mongodb - GORM 在 Grails 中使用 MongoDB 按 ID 获取/查找资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17128436/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com