使用mongodb插件在grails中创建mongodb集合的尝试

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]

有什么解决此问题的想法吗?谢谢。

Grails的哪个版本?您正在使用mongo插件吗?是哪一个,以及它的哪个版本? - tim_yates
Grails 2.1.1和MongoDB:1.0.0.GA - user1723354
我发现实际上只需调用 DBCollection collection = db.getCollection("xyz"),如果不存在,它会隐式地为您创建集合。 - user1723354
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 Map实例。我猜测由于DBObject使用了java.util.Map接口,因此两者在很大程度上可以互换。下面的代码对我来说有效。

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

听起来你已经发现了另一种解决方法,但如果你将一个 map 作为选项参数传递给 db.createCollection() 而不是 BasicDBObject,我很有兴趣知道它是否会起作用。

无论如何,希望这能帮助到那些在尝试让其他mongo api函数在Grails中工作的人们......


@cengerbretson 对我没用.. :( 它对原问题的作者有用吗?我在问题http://stackoverflow.com/questions/25545865/randomly-getting-capped-collection-error-in-tests中发布了我的情况。 - TechSpellBound

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接