Как эффективно кодировать кортеж Scala в MongoDB

Учитывая следующий тип

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", _))

И когда я хочу преобразовать, если из объекта базы данных обратно в 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 в виде массива. Есть ли более эффективный и прямой способ сделать это?

1 ответ

Это более простой способ написать то же самое:

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
  }
Другие вопросы по тегам