Как эффективно кодировать кортеж 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
}