这里有一个关于阵列聚合的话题:
Support of PostgreSQL specific array_agg function in scala frameworks?
然而,由于它目前尚未得到支持,我发现很难用浮油做一些事情。这是一个简单的例子。
比如说,我经营一个商业主办方。 每个聚会都有嘉宾,主持人:
Party(id: Option[Int], name: String)
Guest(id: Option[Int], name: String)
Host(id: Option[Int], name: String)
PartyGuests(partyId, guestId: Int)
PartyHosts(partyId, hostId: Int)
我想要一张所有派对的表格,显示所有的客人和主持人:
PartyId |Guests |Hosts ------------|-----------------------|------ 1 |Adam, Julie, Jack |Tom, Jamie, John 2 |Joe, Jim, Jake |Tom, Tony, James 3 |Amy, Sally |Jenny
我的解决方案是:
// The map is: partyId -> (guestNamesList, hostNamesList)
val partyTable: Map[Int, (List[String], List[String])] = (for {
party <- db.run(parties.result.list)
guest <- db.run(partyGuests
.filter(_.partyId === party.id)
.flatMap(_.guest)
.result.list)
host <- db.run(partyHosts
.filter(_.partyId === party.id)
.flatMap(_.host)
.result.list)
} yield (party, guest, host))
.groupBy { case (party, guest, host) =>
party.id
}
.mapValues { values =>
val myGuests = values.map(_._2).distinct.map(_.name)
val myHosts = values.map(_._3).distinct.map(_.name)
(myGuests, myHosts)
}
然而,这种解决方案在大型数据集上非常耗费空间。有谁知道更好的解决方案?