2013-04-27 62 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