如何通过查询一次查找多个文档

时间:2014-03-12 14:05:33

标签: scala reactivemongo

我在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]] = {

    ???

 }

由于

2 个答案:

答案 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的东西真的很烦人。

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

答案 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)

}