【问题标题】:Grails GORM + Mongo, How to save custom data to id?Grails GORM + Mongo,如何将自定义数据保存到id?
【发布时间】:2013-10-21 20:34:27
【问题描述】:

尝试在 Grails 的 id 字段中保存一些自定义内容:

Cover saveCover = new Cover(id: url, url: url, name: name, sku: sku, price: price)

但在 DB 中,我在 _id 字段中看到如下内容:52658d9284aea229e226ab9c。它让我感到困惑,因为它看起来像 ObjectId,但不是我发送到 Cover 域的字符串(顺便说一下 Cover 域字段 id 是 String)。

这里有什么问题?

【问题讨论】:

    标签: mongodb grails grails-orm


    【解决方案1】:

    这是 MongoDb 自动为您生成的 ObjectID。 见:http://docs.mongodb.org/manual/reference/object-id/

    "MongoDB 使用 ObjectIds 作为 _id 字段的默认值,如果 _id 字段未指定。 MongoDB 客户端应添加具有唯一 ObjectId 的 _id 字段。但是,如果客户端没有添加 _id 字段,mongod 将添加一个包含 ObjectId 的 _id 字段。”

    如果你想设置自己的id,设置“_id”而不是“id”

    【讨论】:

    • 这不起作用,我已将我的字段标记为具有 uniq 值的索引,以在数据库级别保持这种行为。
    【解决方案2】:

    如果您想使用自定义分配的 id 而不是生成的 id,您需要设置映射。

    class Cover {
        String id
        String name
        String url
        String sku
        String price
        static mapping = {
            id generator: 'assigned'
        }
    }
    

    【讨论】:

      【解决方案3】:

      PaddyDwyer 是对的,但我认为答案并不完整。经过几次努力,我还发现对于您手动分配 id 的每个新对象,使用 insert 而不是 save 很重要(参见官方GRAILS_Mongo Doc at 3.1 ),如下:

      Cover c = new Cover()
      c.id = "custom_id"
      c.name = "new name"
      c.insert()
      

      当然,所有分配的 id 都必须完全不同。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-11-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-31
        • 2017-02-12
        相关资源
        最近更新 更多