1

我有一个关于 grails 的 MongoDB id 的问题。我在域类中使用了字符串 id,它会在域类中创建字符串 id,这很好。但是当我在 mongodb 中手动插入条目时(运行 db.Things.insert()),它会为新条目创建一个 ObjectId(不是字符串),我想知道我们如何解决这个问题。

谢谢!

4

2 回答 2

1

引用自:Mongo Collections - 参考文档

默认情况下,GORM 实体提供一个基于整数的标识符。例如以下实体: class Person {} 有一个名为 id 的 java.lang.Long 类型的属性。在这种情况下,用于 Mongo 的 GORM 将使用 Mongo 原子操作文档中描述的技术生成基于序列的标识符。

然而,基于序列的整数标识符对于需要分片(Mongo 的一个更好的特性之一)的环境来说并不理想。因此,通常建议使用基于字符串的 id:

class Person { String id } 或原生 BSON ObjectId:

导入 org.bson.types.ObjectId 类人 { ObjectId id }

BSON ObjectId 实例的生成方式与 UUID 类似。

因此,您应该使用 org.bson.types.ObjectId 替换您的域类的 id

于 2014-02-18T14:12:25.323 回答
0

我发现我可以先创建一个新的 ObjectId,然后当我将它插入 mongoDb 时,我将 ObjectId.str 传递给“_id”属性,然后问题解决,mongo db 级别和 grails 级别都将具有 String 类型的 id场地。

mongo javascript脚本的代码片段如下:

conn = new Mongo();
db = conn.getDB("dbName");

db.user.find().forEach( function(userDoc) {

    // Create a new object Id
    objectId = new ObjectId();

    db.userRole.insert({
        _id: objectId.str,  // Before we insert, convert it as a String
        role: "51437d742cd1d9e80a3f0644",
        user: userDoc._id
    });

});
于 2013-03-18T14:59:37.737 回答