3

以下を使用して、grailsでmongodbコレクションを作成しようとしています。

BasicDBObject DBoptions = new BasicDBObject();
DBCollection collection = db.createCollection("xyz",DBoptions)

しかし、次のエラーが発生します。

Caused by GroovyRuntimeException: Ambiguous method overloading for method com.mongodb.DBApiLayer#createCollection.    
Cannot resolve which method to invoke for [class java.lang.String, class com.mongodb.BasicDBObject] 
due to   overlapping prototypes between:
[class java.lang.String, interface com.mongodb.DBObject]
[class java.lang.String, interface java.util.Map]

これを解決する方法について何かアイデアはありますか?

ありがとう

4

1 に答える 1

3

grails サービス クラスから実行しているときに、mongo ドライバーで利用可能な command() 関数を使用しようとしたときに、同様の問題に遭遇しました。

DBObject を作成してそれを command() 関数に渡そうとするたびに、com.mongodb.DBObject と java.util.interfaces の間でプロトタイプが重複しているというエラーが表示されます。たとえば、DB オブジェクトで db.command() を使用してデータベースの新しいコピーを作成しようとすると、そのエラーがスローされます...

DBObject cmd = new BasicDBObject()
cmd.put("copydb", 1)
cmd.put("todb", "to_database")
cmd.put("fromdb", "from_database")
mongo.getDB("admin").command(cmd) 

少しの試行錯誤を経て、実際に機能するようになったのは、DBObject を作成する代わりに、標準的な groovy マップ インスタンスを渡したことです。私の推測では、DBObject は java.util.Map インターフェースを使用するため、この 2 つはほとんどの場合交換可能であるはずです。以下のコードは私のために働くことになります..

def cmd = [ copydb: 1, "todb": "to_database", "fromdb": "from_database" ]
mongo.getDB("admin").command(cmd)

別の回避策を見つけたようですが、BasicDBObject の代わりに db.createCollection() への options パラメータとしてマップを渡すと、それが機能する場合に興味があります。

とにかく、これが他のmongo api関数のいくつかをgrails内で動作させるのに苦労しているかもしれない誰かを助けることを願っています...

于 2012-11-17T18:59:59.433 に答える