Я действительно боролся с связями типов в scala и с тем, как их эффективно использовать. В настоящее время я пытаюсь понять, как я буду использовать их для редактирования только определенных полей в коллекции Mongo. Это означает передачу определенного объекта, содержащего только те поля, методу, который (после прочтения об отклонениях) Я подумал, что можно сделать так:
abstract class DocClass
case class DocPart1(oId: Option[BSONObjectID], name: String, other: String) extends DocClass
case class DocPart2(city: String, country: String) extends DocClass
С методом, который вызывает более общий метод, например:
def updateMultipleFields(oId: Option[BSONObjectID], dataModel: DocClass): Future[Result] = serviceClientDb.updateFields[T](collectionName, dataModel, oId)
// updateFields updates the collection by passing *dataModel* into the collection, i.e. Json.obj("$set" -> dataModel)
Таким образом, dataModel
может быть объектом DocPart1
или DocPart2
. Я не хочу использовать параметр типа в updateMultipleFields
(так как это интересная статья может предложить), так как это приводит к дополнительным проблемам при передаче их этому методу в других файлах проекта. Я делаю это, чтобы соблюдать DRY и поддерживать эффективные операции с базой данных.
Я ходил кругами с этим - может ли кто-нибудь пролить свет на это?
Отредактировано после комментариев @SerGr
Итак, чтобы быть полностью ясным; Я использую Play/Scala/ReactiveMongo Play JSON (как задокументировано здесь) и у меня есть коллекция MongoDB с большим количеством полей.
case class Doc(oId: Option[BSONObjectID], name: String, city: String, country: String, city: String, continent: String, region: String, region: String, latitude: Long, longitude: Long)
Чтобы создать новый документ, я автоматически сопоставил Doc
(выше) со структурой коллекции (в Play — вот так) и создал форму (для вставки/обновления коллекции) - все работает хорошо!
Но при редактировании документа; Я хотел бы обновить только некоторые поля (чтобы все поля не обновлялись). Поэтому я создал несколько case classes
, чтобы разделить эти поля на более мелкие модели (например, DocPart1
и DocPart2
), и сопоставил данные формы только с одним. Это побудило меня передать их в качестве параметра методу updateMultipleFields
, как показано выше. Я надеюсь, что это имеет больше смысла.