2014-03-12 38 views
1

我有一個List [String]中的產品ID列表。我想從Mongo返回一個List [JsObject],爲產品List中的每個元素返回一個JsObject。如何通過查詢一次查找多個文檔

我有以下得到的只是一個產品:

def getIndivProduct(productID: String): Future[List[JsObject]] = { 

    val cursor: Cursor[JsObject] = collectionItems. 
     find(Json.obj("product-number" -> productID)). 
     cursor[JsObject] 

    val futureProductList: Future[List[JsObject]] = cursor.collect[List]() 

    futureProductList 

} 

我怎樣才能「喂這是字符串列表來搜索並返回?與此簽名:

def getProductsFromList(productIDs: List[String]): Future[List[JsObject]] = { 

    ??? 

} 

感謝

回答

0

你需要一個轉換函數從列表的的非未來的名錄未來-的名錄

import scala.concurrent._ 
import ExecutionContext.Implicits.global 

def singleFuture[A](futures: List[Future[List[A]]]): Future[List[A]] = { 

    val p = Promise[List[A]]() 
    p.success(List.empty[A]) 

    val f = p.future // a future containing empty list. 

    futures.foldRight(f) { 
     (fut, accum) => // foldRight means accumulator is on right. 

     for { 
      listAccum <- accum; 
      listA <- fut 
     } 
     yield (listA ::: listAccum) // List[A] ::: List[A] 
    } 
} 

鑑於此,它很簡單:

def getProductsFromList(productIDs: List[String]): Future[List[JsObject]] = { 

    val indivProdList = productIDs.map(getIndivProduct(_)) 
    singleFuture(indivProdList) 

} 
+0

謝謝,這是有道理的。但這仍然意味着我調用getIndivProduct()函數的次數與列表中的產品通過線路獲取一樣多。 MongoDB位於不同的大陸,所以我希望有一種方法可以使用ReactiveMongo API向Mongo發送一個產品列表,然後它將編譯一個文檔列表並將其發回,所有這些都只需通過一次電話發出。 – sectornitad

1

使用$中,http://docs.mongodb.org/manual/reference/operator/query/in/

def getIndivProduct(productIDs: List[String]): Future[List[JsObject]] = { 

    val cursor: Cursor[JsObject] = collectionItems. 
     find(Json.obj("product-number" -> Json.obj("$in" -> productIDs))). 
     cursor[JsObject] 

    val futureProductList: Future[List[JsObject]] = cursor.collect[List]() 
    futureProductList 
} 

我已經寫了簡單的助手寫複雜的查詢,因爲所有的JSON - > JSON - > Json的東西真的很煩人。

https://github.com/sh1ng/ReactiveMongo-Queries

相關問題