2016-06-13 58 views
0

我正在使用Play 2.5.4和ReactiveMongo编写Play/Scala应用程序。基于this example,我得到使用在ReactiveMongo中获取集合的习惯方式

class SettingStore(val mongo:ReactiveMongoApi) { 
    def collection = mongo.db.collection[BSONCollection]("Settings") 
    // more code... 
} 

然而,db现在已经过时的集合。弃用警告建议我使用database,但是这一个返回Future,所以必须映射所有操作。由于ReactiveMongo的操作也返回Future s,这似乎是多余的...怎样才能获得集合? (或者,我是彻底失去了一些东西,并Future[Future[Future[A]]]是未来?)

+0

您必须使用'.flatMap()'或'for comprehension' –

+0

谢谢。但是'def coll2 = for(db < - mongo.database)yield db.collection [BSONCollection](“GeoMaps”)'仍然产生'Future [BSONCollection]'...我做错了吗? –

+0

是的。你很好。但我不明白问题。 '未来[BSONCollection]'你可以'.map()'到另一个'Future [T]'。在'Action'中,你可以使用'.async()',结果是'Future [Result]'。在显示的例子中,所有的结果都是'Future [T]'/ –

回答

0

如果你看看documentation,你可以看到,而不是过时的.db使用.database功能的例子。

非同步.db已被弃用,因为它没有提供足够的保证能够找到MongoConnection池中的活动连接。

根据网络速度/等待时间,假设池启动后至少有一个连接处于活动状态,但并非总是如此,因为检查/发现ReplicaSet节点可能需要时间。

如果驱动程序在一段时间内无法加入节点(网络中断,节点重新启动...),则相同的断言可能是错误的。这可能需要一些时间,以便节点指示他们重新联机。

新的.database分辨率是异步的,并且使用FailoverStrategy来等待(或不是)可用连接(根据所选的读取首选项...)。