如何将Future [BSONDocument]转换成列表?

时间:2014-02-15 20:23:52

标签: mongodb scala reactivemongo

代码使用ReactiveMongo向MongoDB发送请求并返回Future[BSONDocument],但我的代码处理数据列表,因此我需要获取Future[BSONDocument]的值,然后将其转换为列表。

我最好如何不阻挡地做到这一点?

UPADTE:

我正在使用ReactiveMongo RawCommand

 def findLByDistance()(implicit ec: ExecutionContext) =  db.command(RawCommand(
        BSONDocument(
            "aggregate" -> collName,
            "pipeline" -> BSONArray(BSONDocument(
                "$geoNear" -> BSONDocument(
                    "near" -> BSONArray(44.72,25.365),
                    "distanceField" -> "location.distance",
                    "maxDistance" -> 0.08,
                    "uniqueDocs" -> true)))
                )))

结果出现在Future[BSONDocument]中。对于一些简单的查询,我使用了默认查询构建器,允许进行简单的转换

def findLimitedEvents()(implicit ec: ExecutionContext) =
  collection.find(BSONDocument.empty)
    .query(BSONDocument("tags" -> "lazy"))
    .options(QueryOpts().batchSize(10))
    .cursor.collect[List](10, true)

我基本上需要RawCommand输出类型来匹配之前使用的。

2 个答案:

答案 0 :(得分:0)

不确定您的确切用例(显示更多代码会有所帮助),但将List[Future[BSONDocument]]转换为Future[List[BsonDocument]]可能会很有用,您可以更轻松地{{1}或者onSuccess on,您可以通过以下方式执行此操作:

map

答案 1 :(得分:-1)

你无法在没有阻挡的情况下“获得”未来。如果您想等待Future完成,那么<​​strong>必须阻止。

可以做的是map Future到另一个Future

val futureDoc: Future[BSONDocument] = ...
val futureList = futureDoc map { doc => docToList(doc) }

最终,你将达到你所有未来的组合,映射,恢复等等的一个点,并希望结果能够发生。这是您阻止或建立处理程序以执行最终结果的地方:

val futureThing: Future[Thing] = ...

//this next bit will be executed at some later time,
//probably on a different thread
futureThing onSuccess {
  case thing => doWhateverWith(thing)
}