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