Нужно ли GORM / GMongo обернуть коллекции, чтобы принимать Карты? (Grails / GMongo внутренности.)
Я работаю с доменными объектами Grails Mongo и заметил, что я получаю совершенно другое поведение, используя следующие два способа доступа к коллекции:
c1
: имя коллекции известно во время компиляции:
def c1 = MyDomainClass.collection
c2
: имя коллекции известно только во время выполнения
def c2 = AnyDomainClass.collection.DB.getCollection(collectionName)
c1
а также c2
иметь один и тот же класс, но вести себя по-разному!
И то и другое c1
а также c2
иметь класс com.mongodb.DBApiLayer$MyCollection
но они ведут себя по-разному.
В частности, c1
поддерживает "дружественные" взаимодействия, такие как передача карт непосредственно в методы GMongo, например
c1.find([tag:'spicy']).sort([created:1])
В то время как c2
работает только с DBObject
параметры как:
c2.find(new BasicDBObject([tag:'spicy'])).sort(new BasicDBObject([created:1]))
Я предпочитаю синтаксис в #1, и я хотел бы иметь возможность использовать этот синтаксис с объектами, даже когда я не знаю коллекцию во время компиляции. Другими словами, я хочу иметь возможность динамического доступа к коллекциям (что я могу сделать с #2), но используя "дружественный" синтаксис из #1.
Мои вопросы:
- Как
c1
а такжеc2
разные? - Как я могу создать экземпляры коллекций, которые ведут себя как
c1
когда коллекция неизвестна во время компиляции? - На каком уровне стека Grails/GORM/GMongo обернуты объекты для поддержки преобразований map-to-DBObject и как это делается?