我在List [String]中有一个产品ID列表。我想从Mongo返回一个List [JsObject],为产品列表中的每个元素返回一个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 :(得分:1)
使用$ in,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的东西真的很烦人。
答案 1 :(得分:0)
您需要从 List-of-of-List 到 Future-of-List 的转换功能
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)
}