MongoDB Grails插件ObjectId V.S.字符串ID

时间:2013-03-18 14:22:10

标签: mongodb grails groovy mongodb-java

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

谢谢!

2 个答案:

答案 0 :(得分:1)

参考:Mongo Collections - Reference Documentation

  

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

     

但是,基于序列的整数标识符并不理想   需要分片的环境(其中一个更好的功能)   蒙戈)。因此,通常建议使用基于字符串的ID:

     

class Person {       String id}或本机BSON ObjectId:

     

import org.bson.types.ObjectId class Person {       ObjectId id}

     

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

所以你应该用org.bson.types.ObjectId替换你的域类的id

答案 1 :(得分:0)

我发现我可以先创建一个新的ObjectId然后当我将它插入mongoDb时,我将ObjectId.str传递给“_id”属性,然后解决问题,mongo db level和grails level都会有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
    });

});