2016-06-13 59 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來等待(或不是)可用連接(根據所選的讀取首選項...)。