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 接口,因此两者在大多数情况下应该可以互换。下面的代码最终为我工作..

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

听起来您找到了另一种解决方法,但是如果您将地图作为选项参数传递给 db.createCollection() 而不是 BasicDBObject 是否可行,我会很好奇。

无论如何,希望这可以帮助那些可能正在努力让其他一些 mongo api 函数在 grails 中工作的人......

于 2012-11-17T18:59:59.433 回答