给定以下类型

type GeoLocation = (Double, Double)

我想把这个作为
location: [-55.23, 123.7]

此外,位置数据是可选的,因此api公开了Option[GeoLocation]。到了存储数据的时候,我会转换数据。
val coordinates: Option[GeoLocation] = ...
val location = coordinates match {
  case Some((lng, lat)) => Some(lng :: lat :: Nil)
  case None => None
}

以便我可以有选择地将其添加到包含的文档中。
location.map(doc.put("location", _))

当我想把if从一个数据库对象转换回GeoLocation时,我做了一件很糟糕的事…
val coordinates = dbo.getAs[MongoDBList]("location").map(_.toList.map(_.asInstanceOf[Double])) match {
  case Some(List(lng, lat)) => Some(lng, lat)
  case None => None
}

在我看来,将元组作为数组存储在MongoDB中有很多仪式。有没有更有效、更直接的方法来实现这一点?

最佳答案

这是一个简单的方法来写同样的东西:

val coordinates = dbo.getAs[Seq[Double]]("location").map { case Seq(lng, lat) => (lng, lat) }

如果您希望更具保护性(如果数组中有两个以上的元素,则不会出现matcherror),则可以“捕获”其余元素:
val coordinates = dbo.getAs[Seq[Double]]("location") match {
    case Some(Seq(lng, lat)) => Some(lng, lat)
    case _ => None
  }

07-24 17:15