【问题标题】:Adapt Enumerator / Iteratee to Stream使 Enumerator / Iteratee 适应 Stream
【发布时间】:2013-05-02 06:51:18
【问题描述】:

我有一个 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],该 Stream[Ping] 将被编组为 JSON 响应。我想知道是否可以将 Enumerator 或 Iteratee 调整为 Stream,所以我可以返回它。

【问题讨论】:

    标签: scala playframework-2.0 spray


    【解决方案1】:

    您可以在 Cursor 实例上使用 collect[Stream] 而不是 enumerate 来执行此操作:

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

    编辑:使用cursor.toList.toStream。这将收集与查询匹配的所有文档,然后生成一个流。

    【讨论】:

    • 关闭。这会返回一个 Future[Stream[Ping]],但是当我尝试它时,它只返回集合的第一个元素。
    • 使用cursor.toList.toStream编辑。
    • 你知道,假设有一千个对象的集合,使用 toList.toStream 是否会从 Mongo 将它们全部加载到内存中,或者是否一次获取一个?
    • 它最终会将它们从 MongoDB 加载到内存中。在诸如此类的非阻塞上下文中,Stream[Document] 是有问题的:对tail 的调用将阻塞下一个文档。这就是创建枚举器/迭代器的原因:)
    猜你喜欢
    • 2012-03-12
    • 2014-08-30
    • 2012-04-27
    • 1970-01-01
    • 1970-01-01
    • 2013-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多