2014-10-31 30 views
0

我正在Scala編寫Play 2.3.2應用程序。編譯計算Future的方法的錯誤[List [(String,Int)]]

我正在使用MongoDB數據庫和reactivemongo驅動程序。

在我的項目中,我有兩個集合:一個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" : "[email protected]" 
    }, 
    "tags" : [ 
     { 
      "tag" : "Canned/Jarred Goods:Rice - Aborio" 
     }, 
     { 
      "tag" : "Fish:Swordfish Loin Portions" 
     }, 
     { 
      "tag" : "Alcool:Wine - Touraine Azay - Le - Rideau" 
     } 
    ], 
    "date" : 1414665108468 
} 

"date"代表以毫秒爲單位的日期格式。現在

,我寫的是,每一個標籤(在recommendation.tags集合中的"tag"場),它計算的次數,標籤的值等於recommendation.requests收集"tags"場數量的方法。

我試圖實現這樣的方法:

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) 

但是,編譯器給了我以下錯誤:

[error] /Users/alberto/git/bdrim/modules/recommendation-system/app/recommendationsystem/controllers/StatisticsController.scala:168: type mismatch; 
[error] found : List[scala.concurrent.Future[(String, Int)]] 
[error] required: scala.concurrent.Future[List[(String, Int)]] 
[error] val futureTags: Future[List[(String, Int)]] = Tags.all.toList flatMap {tags => tags map {tag => 
[error]                      ^
[error] one error found 
[error] /Users/alberto/git/bdrim/modules/recommendation-system/app/recommendationsystem/controllers/StatisticsController.scala:168: type mismatch; 
[error] found : List[scala.concurrent.Future[(String, Int)]] 
[error] required: scala.concurrent.Future[List[(String, Int)]] 
[error] val futureTags: Future[List[(String, Int)]] = Tags.all.toList flatMap {tags => tags map {tag => 
[error] 

我不明白使用Future有什麼問題。

+0

Future.traverse(tags){tag => ... – viktortnk 2014-11-01 15:57:18

+0

@viktortnk我把Future.traverse()作爲第一條指令,但它不編譯,在哪裏我必須把Future.traverse指令? – 2014-11-03 08:20:18

回答

0

我覺得flatmap

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

應該由地圖

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

當你flatmap則預計列表的列表,然後將被夷爲平地的列表被替換。你正在使用flatMap,並且只返回一個元組

+0

在這種情況下,它並不期待列表的列表,而是嵌套'Future'。 – 2014-10-31 15:48:09

+0

@Rovak我已經按照你的建議改變了我的代碼,但代碼不能編譯。我更新了我的帖子。 – 2014-11-01 15:11:59

相關問題