我正在使用 Grails Mongo 域对象,我注意到通过以下两种访问集合的方式我得到了非常不同的行为:
c1
:集合名称在编译时已知:
def c1 = MyDomainClass.collection
c2
:集合名称仅在运行时已知
def c2 = AnyDomainClass.collection.DB.getCollection(collectionName)
c1
并c2
拥有相同的班级,但行为不同!
两者c1
都有c2
课程com.mongodb.DBApiLayer$MyCollection
,但他们的行为不同。
具体来说,c1
支持“友好”交互,例如将 Maps 直接传递给 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 堆栈的哪一层包裹了对象以支持映射到 DBObject 的转换,这是如何完成的?