Сопоставление GORM mongodb с существующей структурой коллекции

#grails #mongodb #grails-orm

#grails #mongodb #grails-orm

Вопрос:

Я новичок в Grails amp; GORM, так что это может быть быстрый вопрос. В настоящее время мы рассматриваем возможность использования поддержки GORMs mongo, и у меня возникает несколько проблем с сопоставлением существующих данных коллекции. Я в основном хочу сопоставить иерархическую структуру объектов, в которой мой объект «Продавец» имеет ссылку на другого родительского продавца. Структура BSON довольно проста, т.е.:

 {
   name: "name",
   parent_id: ObjectId("[Object Id ref]")
}
  

В моей модели я попытался отобразить эту взаимосвязь следующим образом:

 class Merchant {
    ObjectId id
    String name
    Merchant parent

    static belongsTo = [parent: Merchant]
    static mappedBy = [parent: "parentId"]

    static mapping = {
        collection  "merchants"
    }
    static constraints = {
    }
}
  

Это привело к следующему BSON:

 {
        "_id" : ObjectId("4ea6be91ce5f56cd49f43ab8"),
        "name" : "where will you g",
        "version" : NumberLong(1),
        "parent" : {
                "$ref" : "merchants",
                "$id" : ObjectId("4ea6be91ce5f56cd49f43ab8")
        }
}
  

Это связано с двумя проблемами, а именно:
— Имя родительского поля продавца — «parent», а не «parent_id», которое является обязательным.
— Значение родительского поля содержит дополнительную метаинформацию, отличную от идентификатора, например, $ref: «торговцы».

В любом случае я могу сохранить нашу существующую структуру BSON и при этом иметь расширенное отображение объектов.

Приветствую, Крис.

Комментарии:

1. Похоже, вы можете решить часть проблем, присвоив parent_id «столбцу» имя: grails.org/doc/latest/guide/GORM.html#tableAndColumnNames Кроме того, возможно, вы не хотите использовать mappedBy или указывать коллекцию. Возможно, это действительно должно быть table 'merchants' не collection. Не уверен на 100% во всем этом.

Ответ №1:

Для двух проблем вам необходимо дополнительное сопоставление:

 static mapping = {
    collection 'merchants'
    parent attr:'parent_id', reference:false
}
  

Вы также должны удалить блок mappedBy, поскольку он вам нужен только при наличии нескольких полей одного и того же типа.

Наконец, обратите внимание, что reference:false является значением по умолчанию в последних версиях плагина (я думаю, 1.2 ). Обратите внимание, что ‘attr’ называется ‘ColumnName’ в других версиях GORM.