2013-04-27 30 views
1

我可能错过了一些显而易见的事情,但在ReactiveMongo API(v0.8)中,您如何设置查询返回的文档数量限制?ReactiveMongo - 收集最新文档?

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

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()的作品来获取一个结果,但我没有明确使用任何种类蒙戈限制条款,所以我很担心这个查询对数据库的影响。请帮助我改进此代码。提前致谢。

回答

3

在0.8,你必须在batchSize选项,以告诉MongoDB的关闭设置为1数据库游标自动:

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] 

one[T]方法0.9套BATCHSIZE标志为您和返回Option[T]

+0

在哪个文件中定义了新的[T]方法Stephane?我在升级时发现它具有自动完成功能,但想仔细阅读源代码:) – alex 2013-04-27 18:01:04

+2

它在此处定义:https://github.com/zenexity/ReactiveMongo/blob/master/driver/src/main/scala/api/collections /genericcollection.scala#L355 :)您可以检出已更新的[scaladoc](http://reactivemongo.org/releases/0.9/api/index.html#reactivemongo.api.collections.default.BSONQueryBuilder)。 – 2013-04-27 18:03:04

+0

谢谢 - 我想它必须在使用游标之前将选项添加到查询文档中。如果没有批量处理,常规headOption会是什么样的呢?你能否继续在同一个光标上调用headOption?并很抱歉在你面前回答! – alex 2013-04-27 18:08:18

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

+0

这是否确实在数据库端执行行限制查询,还是只取得游标的第一个结果?我很想知道底层的Mongo DB是否会做不必要的工作。谢谢你的帮助。 – 2013-04-27 16:39:00

+0

我不认为它确实。我只是测试了一个简单的例子,并在mongo shell中设置了db.setProfilingLevel(2)。结果查询包含“ntoreturn”:0(如果您的find查询不限制为唯一索引,将返回默认限制,大概为20)。添加“QueryOpts()。batchSize(1)”作为查找功能的第二个参数修复了这个问题:)好了!大多数情况下,我只使用headOption和独特的索引。看看0.9如何处理这个问题会很有趣。 – alex 2013-04-27 17:51:58