2016-06-13 5 views
0

Я пишу приложение Play/Scala, используя Play 2.5.4 и ReactiveMongo. На основе this example, я получаю коллекцию, используяИдиоматический способ получения коллекции в ReactiveMongo

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

Однако db теперь осуждается. Предупреждение об отказе рекомендуется использовать database, но этот возвращает Future, поэтому все операции должны отображаться. Так как операции ReactiveMongo также возвращают Future с, это кажется излишним ... Каким образом можно получить сбор? (Или, я полностью отсутствует что-то и Future[Future[Future[A]]] будущее?)

+0

Вы должны использовать '.flatMap()' или 'для понимания' –

+0

Спасибо. Но 'def coll2 = for (db <- mongo.database) yield db.collection [BSONCollection] (" GeoMaps ")' все еще дает 'Future [BSONCollection]' ... я делаю это неправильно? –

+0

Да. Вы ругаетесь. Но я не понимаю проблемы. 'Future [BSONCollection]' вы можете '.map()' другому 'Future [T]'. В 'Action' вы можете использовать' .async() 'в результате' Future [Result] '. В показанном примере все результаты: 'Future [T]'/ –

ответ

0

Если вы посмотрите на documentation, вы можете увидеть примеры, используя функцию .database вместо устаревшего .db.

Не-асинхронный .db был устарел, так как он не предоставил достаточной гарантии, чтобы иметь возможность найти активное соединение в пуле MongoConnection.

Предполагалось, что как только пул будет запущен, как минимум одно соединение будет активным, что не всегда происходит, так как проверка/обнаружение узлов ReplicaSet может занять время в зависимости от скорости/задержки сети.

Такое же утверждение может быть неверным, если драйвер не может присоединиться к узлам в течение некоторого времени (прерывание сети, перезапуски узлов, ...). Это может занять некоторое время, поэтому узлы указывают, что они снова подключены к сети.

Новое разрешение .database является асинхронным, и используйте FailoverStrategy, чтобы подождать (или нет) для доступного соединения (в соответствии с выбранным предпочтением чтения, ...).