ReactiveMongo - 收集最新文档?

时间:2013-04-27 13:03:32

标签: mongodb playframework-2.0

我可能错过了一些明显的东西,但在ReactiveMongo API(v0.8)中,如何设置查询返回的文档数量限制?

我想返回添加到集合中的最新单个文档。到目前为止,这是我的代码:

def getLatest()(implicit reader: reactivemongo.bson.handlers.RawBSONReader[T]):     Future[Option[T]] = {
    collection.find (QueryBuilder(
        queryDoc = Some(BSONDocument()),
        sortDoc = Some(BSONDocument("_id" -> BSONInteger(-1)))
    )).headOption().mapTo[Option[T]]
}

headOption()用于检索单个结果,但我没有明确使用任何类型的Mongo限制子句,所以我担心这个查询对数据库的影响。请帮我改进这段代码。提前谢谢。

2 个答案:

答案 0 :(得分:3)

在0.8中,您必须将batchSize选项设置为1,以告知MongoDB自动关闭数据库游标:

val maybedoc = collection.find(BSONDocument(), QueryOpts().batchSize(1)).headOption
// or using QueryBuilder like you do
val maybedoc2 = collection.find (QueryBuilder(
    queryDoc = Some(BSONDocument()),
    sortDoc = Some(BSONDocument("_id" -> BSONInteger(-1)))
), QueryOpts().batchSize(1)).headOption()

0.9系列已经过重构并大大简化。现在你可以这样做:

val maybedoc = collection.
                 find(BSONDocument()).
                 sort(BSONDocument("_id" -> -1)).
                 one[BSONDocument]

0.9中的one[T]方法为您设置batchSize标志并返回Option[T]

答案 1 :(得分:1)

是的,headOption()函数将查询限制为只有一个结果:

def headOption()(implicit ec: ExecutionContext) :Future[Option[T]] = {
  collect[Iterable](1).map(_.headOption)
}

https://github.com/zenexity/ReactiveMongo/blob/0.8/src/main/scala/api/cursor.scala#L180