3

我正在使用 Grails Mongo 域对象,我注意到通过以下两种访问集合的方式我得到了非常不同的行为:

c1:集合名称在编译时已知:

def c1 = MyDomainClass.collection

c2:集合名称仅在运行时已知

def c2 = AnyDomainClass.collection.DB.getCollection(collectionName)

c1c2拥有相同的班级,但行为不同!

两者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 中的“友好”语法。

我的问题是:

  1. c1什么c2不同?
  2. 如何实例化c1在编译时集合未知时行为的集合?
  3. 在 Grails/GORM/GMongo 堆栈的哪一层包裹了对象以支持映射到 DBObject 的转换,这是如何完成的?
4

0 回答 0