我有一个关于 grails 的 MongoDB id 的问题。我在域类中使用了字符串 id,它会在域类中创建字符串 id,这很好。但是当我在 mongodb 中手动插入条目时(运行 db.Things.insert()),它会为新条目创建一个 ObjectId(不是字符串),我想知道我们如何解决这个问题。
谢谢!
我有一个关于 grails 的 MongoDB id 的问题。我在域类中使用了字符串 id,它会在域类中创建字符串 id,这很好。但是当我在 mongodb 中手动插入条目时(运行 db.Things.insert()),它会为新条目创建一个 ObjectId(不是字符串),我想知道我们如何解决这个问题。
谢谢!
默认情况下,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
我发现我可以先创建一个新的 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
});
});