Grails Mongo ドメイン オブジェクトを使用していますが、次の 2 つの方法でコレクションにアクセスすると、動作が大きく異なることに気付きました。
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
コンパイル時にコレクションが不明な場合のように動作するコレクションをインスタンス化するにはどうすればよいですか?- map から DBObject への変換をサポートするためにオブジェクトがラップされているのは、Grails/GORM/GMongo スタックのどの層ですか? また、これはどのように行われますか?