在计算Future [List [(String,Int)]]的方法上编译错误

时间:2014-10-31 14:18:48

标签: mongodb scala asynchronous playframework future

我正在Scala中编写Play 2.3.2应用程序。

我正在使用带有reactivemongo驱动程序的MongoDB数据库。

在我的项目中,我有两个集合:一个recommendation.tags集合,用于存储我的应用程序中使用的所有标记,以及recommendation.requests集合,用于存储请求用户和关联的标记。

recommendation.tags集合的文档如下所示:

{
    "_id" : ObjectId("545211fefcacc71587d5fe7b"),
    "tag" : "Beverage:Tea - Camomele  & Beverages"
}

recommendation.requests的文档如下所示:

{
    "_id" : ObjectId("54521395fcacc71587d600db"),
    "id" : "c9f7eda2-70c2-473e-94dd-3ecb6cabb0b8",
    "user" : {
        "id" : "5452138b2318ab1f91ccd254",
        "email" : "rgutierrez@livefish.info"
    },
    "tags" : [
        {
            "tag" : "Canned/Jarred Goods:Rice - Aborio"
        },
        {
            "tag" : "Fish:Swordfish Loin Portions"
        },
        {
            "tag" : "Alcool:Wine - Touraine Azay - Le - Rideau"
        }
    ],
    "date" : 1414665108468
}

"date"表示以毫秒为单位的日期。

现在,我正在编写一种方法,对于每个标记("tag"集合中的recommendation.tags字段),它会计算标记值等于{{1}的次数} "tags"集合的字段。

我试图像这样实现这个方法:

recommendation.requests

def calculate(range: Range): Future[Option[List[(String, Int)]]] = { val futureTags: Future[List[(String, Int)]] = Tags.all.toList map {tags => tags map {tag => //calculate the occurrences for every tag val tagName = tag.category + ":" + tag.attr val tagCondition = Json.obj("tags.tag" -> tagName) val gte = Json.obj("date" -> Json.obj("$gte" -> range.startDate)) val lte = Json.obj("date" -> Json.obj("$lte" -> range.finishDate)) val query = Json.obj("$and" -> Json.arr(tagCondition, gte, lte)) Requests.find(query).toList flatMap {results => (tagName, results.size) //return the (tagName, occurrences) } } } futureTags flatMap {tags => if(tags.size > 0) { val correctList = for(el <- tags; if(el._2 > 0)) yield el Future{Some(correctList)} } else Future{None} } } 是这样定义的类:

Range

但是编译器给了我以下错误:

case class Range (
      startDate: Long,
      finishDate: Long)

我无法理解使用Future有什么问题。

1 个答案:

答案 0 :(得分:0)

我认为flatmap

Requests.find(query).toList flatMap { results => 
    (tagName, results.size)
}

应替换为地图

Requests.find(query).toList map { results => 
    (tagName, results.size)
}

当你进行flatmap时,它需要一个列表列表,然后将列表展平。您正在使用flatMap并且只返回单个元组