2013-03-18 2 views
0

У меня есть вопрос о MongoDB id для grails. Я использовал String id в классе домена, он создавал бы строковый идентификатор в классе домена, который был бы точным. Но когда я вставляю записи в mongodb mannually (запустите db.Things.insert()), он создаст ObjectId (который не является String) для новой записи, интересно, как мы могли бы решить эти проблемы.Плагин MongoDB Grails ObjectId V.S. Строка id

спасибо!

+0

Подождите ваше название говорит ObjectID против строки ид но ваш вопрос говорит, как предотвратить MongoDB от вставки ObjectID по умолчанию, который является его ? – Sammaye

+0

Неплохо, мой вопрос заключается в том, как сделать вставку данных согласованной между генерацией граалов и генерацией уровня mongodb. Из-за двух разных типов идентификаторов (String и ObjectId) это может быть проблемой при поиске записей, вот что я хочу спросить: как я могу устранить несогласованность для уровня Grails и уровня mongoDb? – lorixx

+0

Единственный способ действительно потребовать, чтобы консоль MongoDB вводила его так же, как и ваш плагин Grails. Хммм, вы можете сделать оболочку для функции вставки, которая всегда будет определять вставка '_id' в качестве строки. Это то, что вам нужно добавить дополнительное поле в документ при вставке '_id', а консоль MongoDB будет вставлять ваш' _id' вместо своего. – Sammaye

ответ

0

Я понял, что сначала могу создать новый ObjectId, а затем, когда я вставляю его в mongoDb, передаю ObjectId.str для свойства «_id», тогда проблема решена, уровень уровня mongo db и уровень grails будут иметь Строковый тип для поля id.

Фрагмент кода выглядит следующим образом для Монго 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 
    }); 

}); 
0

Refrence от: Mongo Collections - Reference Documentation

По умолчанию в Горм лиц поставляются с целочисленным на основе идентификатора. Так, например, следующий объект: class Person {} Имеет свойство, называемое id типа java.lang.Long. В этом случае GORM для Mongo будет генерировать идентификатор на основе последовательности, используя технику , описанную в документации Mongo по атомным операциям.

Однако последовательности, основанные на целых идентификаторах, не идеальны для сред с , для которых требуется оштукатурить (одна из лучших функций Mongo). Поэтому, как правило, рекомендуется использовать идентификаторы либо на основе строк:

класс Person { идентификатор строки} Или уроженцем BSON ObjectId:

импорт класс org.bson.types.ObjectId Person { ObjectId идентификатор}

Объекты BSON ObjectId генерируются аналогично UUID.

Таким образом, вы должны заменить идентификатор вашего домена класса, используя org.bson.types.ObjectId

Смежные вопросы