我正在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有什么问题。
答案 0 :(得分:0)
我认为flatmap
Requests.find(query).toList flatMap { results =>
(tagName, results.size)
}
应替换为地图
Requests.find(query).toList map { results =>
(tagName, results.size)
}
当你进行flatmap时,它需要一个列表列表,然后将列表展平。您正在使用flatMap并且只返回单个元组