我正在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有什麼問題。
Future.traverse(tags){tag => ... – viktortnk 2014-11-01 15:57:18
@viktortnk我把Future.traverse()作爲第一條指令,但它不編譯,在哪裏我必須把Future.traverse指令? – 2014-11-03 08:20:18