Адаптировать Enumerator/Iteratee к потоку

У меня есть приложение Spray, в котором я использую reactive-mongo для подключения к моей базе данных Mongo.

val collection: BSONCollection = db("ping")
val cursor: Cursor[Ping] = collection.find(BSONDocument()).cursor[Ping]
val e: Enumerator[Ping] = cursor.enumerate()

Курсор ReactiveMongo позволяет мне получать данные по частям. Этот курсор можно преобразовать в play.api.libs.iteratee.Enumerator, который, в свою очередь, связан с play.api.libs.iteratee.Iteratee, где любой код, который я хочу, вызывается для каждого элемента коллекции. «Ping» — это объект моего домена.

С помощью Spray можно вернуть Stream[Ping], который будет преобразован в ответ JSON. Я хотел бы знать, можно ли адаптировать Enumerator или Iteratee к потоку, чтобы я мог вернуть это.


person Luciano    schedule 01.05.2013    source источник


Ответы (1)


Вы можете использовать collect[Stream] вместо enumerate в Cursor для этого:

val collection: BSONCollection = db("ping")
val cursor: Cursor[Ping] = collection.find(BSONDocument()).cursor[Ping]
val stream: Stream[Ping] = cursor.toList.toStream

РЕДАКТИРОВАТЬ: Используется cursor.toList.toStream. Это соберет все документы, соответствующие запросу, а затем создаст поток.

person Stephane Godbillon    schedule 01.05.2013
comment
Закрывать. Это возвращает Future[Stream[Ping]], но когда я пытаюсь это сделать, он возвращает только первый элемент коллекции. - person Luciano; 02.05.2013
comment
Отредактировано с помощью cursor.toList.toStream. - person Stephane Godbillon; 02.05.2013
comment
Знаете ли вы, если предположить, что коллекция из тысячи объектов, используя toList.toStream, загрузит их все в память из Mongo или они будут извлекаться по одному? - person Luciano; 02.05.2013
comment
В конечном итоге он загрузит их в память из MongoDB. В неблокирующем контексте, таком как этот, Stream[Document] проблематичен: вызов tail заблокирует для следующего документа. Вот почему были созданы Enumerator/Iteratees :) - person Stephane Godbillon; 02.05.2013